При использовании реактивных форм с асинхронным валидатором в группе форм и при изменении значений группы форм с помощью patchValue
в конструкторе или в ngOnInit
- даже если наблюдаемый асинхронный валидатор завершается, форма остается в состоянии PENDING
.
Я создал SSCCE в Stackblitz
В примере вы видите простую форму с двумя полями, с указанием статуса формы и состояния валидатора. В коде в ngOnInit
я вызываю patchValue
в форме, в результате чего форма переходит в состояние PENDING
и вызывается асинхронный валидатор.
Асинхронный валидатор мало что делает, он просто ждет 1 секунду, а затем возвращает объект ошибок null
, в основном говоря, что форма действительна. По указателям видно, что проверка завершена, но форма остается в состоянии PENDING
.
Если вы инициируете изменение значений полей в любое время, кроме как в конструкторе или в ngOnInit
(т.е. при построении объекта), тогда форма действительно переходит в состояние VALID
, когда валидатор завершает работу. Это также применимо, если вы заключите изменение значения в setTimeout
.
Я делаю что-то неправильно? Это нормальное поведение или ошибка в Angular?
patchValue
слишком быстро (до того, как форма был полностью построен и установлены предыдущие значения), это вызывает это. Так что нет, это не ошибка, это вызвано асинхронностью угловых форм. Иногда возникают другие проблемы, вызванные асинхронностью форм, поэтому иногда вам нужно подождать галочку (используя settimeout), прежде чем что-то делать, вот один (не связанный) вопрос stackoverflow.com/a/58578113/6294072 - person AJT82   schedule 13.11.2019patchValue
не следует вызывать в том же кадре, который создает _2 _... - person Aviad P.   schedule 13.11.2019