【发布时间】:2021-07-12 23:31:17
【问题描述】:
我有一个很大的响应式表单,它显示在两个选项卡上(每个选项卡都由 *ngIf 隐藏/显示)。我通过 Inputs() 将必要的 FormGroups / Arrays 传递给这些选项卡。在第二个选项卡上,有一个基于 FormArray 构建的项目列表,其中一些 FormControls 具有如下异步验证器:
static ibanValidator(service: ValidationService) {
return (control: AbstractControl) => {
if (!control.value) {
return of(null);
}
return control.valueChanges.pipe(
debounceTime(500),
distinctUntilChanged(),
take(1),
switchMap(v => {
return service.validateIBAN(v)
}),
map((result: ValidationStatus) => {
let e = null;
if (result !== ValidationStatus.OK) {
e = {};
e[result.toLowerCase()] = 'IBAN'
}
return e;
})
);
}
}
当我停留在第二个选项卡上时一切正常(当我更改字段值时,验证器进行异步调用并且状态变为 -> PENDING -> VALID。 但是当我回到第一个选项卡时,然后在视图创建角度调用: _updateTreeValidity -> 并且对于每个导致异步验证器被调用的字段 updateValueAndValidity 并且我在具有异步验证器的字段上获得 PENDING 状态,因为控制没有改变 (_pendingChange = 假)。 如何正确处理?难道我做错了什么?我应该在单独的表单上构建每个选项卡吗?
感谢您的帮助!
【问题讨论】:
标签: angular validation asynchronous