demidov555
@demidov555
front-end

Как вернуть первое значение кастомной валидации (NG_VALIDATOR) при использовании ngIf?

Если на дочерний компонент повесить ngIf и в этом компоненте будет использоваться NG_VALIDATOR (и NG_VALUE_ACCESSOR соответственно), то метод validate будет дергаться столько раз, сколько мы перерендерим компонент.

Проблема в том что validate вызывается n раз, а родительский контрол принимает только первое значение.
Представим кейс если дочерний компонент не валидный и при этом скрылся.
Как обойти? Через стили думаю не круто.

https://stackblitz.com/edit/angular-ivy-pzqcgy

1) Кликаем по кнопке 2 раза (чтобы не валидный инпут скрылся а потом появился)
2) Вводим данные в инпут
2) result уже не будет true
  • Вопрос задан
  • 69 просмотров
Решения вопроса 1
Xuxicheta
@Xuxicheta Куратор тега Angular
инженер
Надо очищать валидаторы, если удаляется директива, их накладывающая. Само оно это не делает.

Это вообще печально, валидация контрола у нас производится одной функцией, а не массивом функций. Несколько валидаторов при их сетапе сливаются в один (под капотом вызывается Validators.compose со старым валидатором и с новым), поэтому удалять вавлидаторы произвольно нельзя.
Ну и директива, провайдящая валидатор точно так же не может снять свой валидатор с контрола при ее ngOnDestroy.

Поэтому каждый раз, когда вы рендерите свой компонент, его валидатор добавляется ко всем прочим и останется в памяти даже после уничтожения компонента (и удержит вроде бы удаленный CVA в памяти, это утечка). Сами значения будут прилетать в новый CVA, а валидатор все равно будет цеплять всех.

вот пример как фиксить https://stackblitz.com/edit/angular-ivy-va9xuk
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы