要在表单数组中的表单组内设置验证器,我尝试了此链接中描述的方法:
无法在 FormArray 中的 FormGroup 内设置动态验证器 - Angular
我试过了,它非常适合添加验证器,但它不适用于删除它们。
我试过 remove validators 方法和 clear validators 方法,但它们不起作用。
// let groupItems:any = (this.formGroup.get("address") as FormArray).controls;
const groupItems: any = (address as FormArray).controls;
for (const item of groupItems) {
item.controls.city.clearValidators();
item.controls.state.clearValidators();
}
在 formGroup 中删除 formArray 的动态验证器的方法是什么?
更新
我尝试添加`updateValueAndValidity(),但它给了我一个堆栈错误:
for (const item of groupItems)
item.controls.city.clearValidators();
item.controls.city.updateValueAndValidity();
item.controls.state.clearValidators();
item.controls.state.updateValueAndValidity();
}
我加了
updateValueAndValidity()
,但是没用。它给了我一个堆栈错误。 updateValueAndValidity({ onlySelf: true, emitEvent: false })
;
我向选择器添加了一个侦听器,它使用 take(1)
rxJS 管道触发验证更改,并像这样设置验证:
Selector?.valueChanges
.pipe(take(1))
.subscribe(SelectorRes => {
if (SelectorRes === true) {
const groupItems: any = (address as FormArray)
.controls;
for (const item of groupItems) {
item.controls.city.setValidators(
Validators.required
);
item.controls.city.updateValueAndValidity({
onlySelf: true,
emitEvent: false
})
item.controls.state.setValidators(Validators.required);
item.controls.state.updateValueAndValidity({
onlySelf: true,
emitEvent: false
})
}
address?.updateValueAndValidity({
onlySelf: true,
emitEvent: false
});
// !was
console.log('call validation 1');
} else if (
SelectorRes === false
) {
const groupItems: any = (address as FormArray)
.controls;
for (const item of groupItems) {
item.controls.city.clearValidators();
item.controls.city.updateValueAndValidity()
item.controls.state.clearValidators();
item.controls.state.updateValueAndValidity();
}
// !was
console.log('delete validation 2');
}
});
有效,但一次更改调用太多次,我认为:
根据Angular文档:
在运行时添加或删除验证器时,必须调用 updateValueAndValidity() 以使新验证生效。
你可以这样做:
const groupItems: any = (address as FormArray).controls;
for (const item of groupItems) {
item.controls.city.clearValidators();
item.controls.city.updateValueAndValidity();
item.controls.state.clearValidators();
item.controls.state.updateValueAndValidity();
}