Angular 我应该如何基于表单的当前值将条件验证逻辑应用于反应表单?

Angular 我应该如何基于表单的当前值将条件验证逻辑应用于反应表单?,angular,forms,Angular,Forms,我有一些这样的代码: this.form.controls[keyOf<IBranchForm>('vatNo')].valueChanges .subscribe(change => { this.setOrRemoveValidators(this.form); }); private setOrRemoveValidators(form: FormGroup): vo

我有一些这样的代码:

this.form.controls[keyOf<IBranchForm>('vatNo')].valueChanges
                .subscribe(change => {
                    this.setOrRemoveValidators(this.form);
                });

private setOrRemoveValidators(form: FormGroup): void {
    const vatNoIsRequired = true;
    if (vatNoIsRequired) {
        form.controls['vatNo'].setValidators(Validators.required);
    }
    else {
        form.controls['vatNo'].setValidators([]);
    }

    form.controls['vatNo'].updateValueAndValidity();
}
this.form.controls[keyOf('vatNo')].valueChanges
.订阅(更改=>{
this.setOrRemoveValidators(this.form);
});
私有setOrRemoveValidators(表单:FormGroup):无效{
const-vatnoiserequired=true;
如果(需要){
控件['vatNo'].setValidators(Validators.required);
}
否则{
控件['vatNo'].setValidators([]);
}
控件['vatNo'].updateValueAndValidity();
}
我面临的问题是,我需要更新表单值和有效性,以便添加或删除UI中显示的错误,但这当然会导致订阅再次运行,我们进入无限循环

我现在觉得,基于值更改来更改表单值或有效性的方法可能不是正确的方法,因为绕过这些问题(emitEvent:false也不会导致UI更新)会变得混乱


那么,解决这个问题的正确方法是什么呢?

您可能需要使用自定义验证器。请记住,即使验证器接收到它所附加的AbstractControl,所以理论上您可以检查其他字段的值,但validites仅在值更改时更新。因此,您最好在FormGroup级别编写一个自定义验证器。在验证器中,您可以使用getErrors on字段,根据需要更改对象,并使用修改后的对象使用setErrors。这样,表单上的任何更改都会触发验证。或者您可以
updateValueAndValidity({emitEvent:false})
。仍然有一些情况下,您只想在某些情况下应用验证器。这应该可以回答您的问题