在表单组上使用带有异步验证器的响应式表单时,如果在构造函数中或在ngOnInit
中使用patchValue
更改表单组的值,即使异步验证器observable完成,表单仍处于PENDING
状态。
我在Stacklitz 中创建了一个SSCCE
在该示例中,您看到一个简单的表单,它有两个字段,其中指示表单状态和验证器状态。在代码中,在ngOnInit
中,我在表单上调用patchValue
,使表单进入PENDING
状态,并调用异步验证器。
异步验证器没有做太多工作,它只是等待1秒,然后返回一个null
错误对象,基本上表明表单是有效的。您可以在指示中看到验证已完成,但表单仍处于PENDING
状态。
如果在构造函数或ngOnInit
(即对象构造(之外的任何时间触发字段值的更改,那么在验证器完成时,表单确实会进入VALID
状态。如果将值更改包装在setTimeout
中,这也适用。
我做错什么了吗?这是正常行为,还是Angular中的错误?
在异步验证器之后,我遇到了类似的问题,表单卡在了PENDING上,我就是这样处理的:
1( 观察状态变化:
this.form$ = this.form.statusChanges;
2( 订阅可观察:
this.form$.subscribe( r => {
if (r === 'VALID') {
//form valid
} else if( r === 'PENDING') {
setTimeout(() => {
this.form.updateValueAndValidity(); // this function will trigger statusChange one more time.
}, 2000);
} else {
// any other status
}
});
所以,如果异步验证器完成了,但没有触发状态更改,那么你所能做的就是自己再触发一次状态更改。