为了做到这一点,您必须使用 Angular AbstractControl 附带的 setValidators、clearValidators 和 updateValueAndValidity 函数的组合。
这是一个例子:
isSelected: boolean;
form: FormGroup;
setStakeValidators(): void {
const stakeControl = this.form.get('stake');
if (this.isSelected === false) {
stakeControl.setValidators([Validators.min(1), Validators.required]);
} else {
stakeControl.clearValidators();
}
stakeControl.updateValueAndValidity();
}
在这个示例函数中,您首先从您正在使用的FormGroup 获得stake 控件。然后,根据isSelected 的值,您可以将验证器设置为您需要的验证器,或者清除它们以便不会进行验证。之后,由于表单不会自动重新验证,因此您在控件上运行 updateValueAndValidity() 以强制进行验证循环。
您会在我上面包含的文档链接中注意到,如果您使用异步验证器,这些函数有异步版本可用。
观察isSelected 表单控件值变化的一种方法是订阅该控件的valueChanges observable,并根据订阅中返回的值运行验证器对stake 控件的更改。
见下文:
this.form.get('isSelected').valueChanges.subscribe(value => {
const stakeControl = this.form.get('stake');
if (value === false) {
stakeControl.setValidators([Validators.min(1), Validators.required]);
} else {
stakeControl.clearValidators();
}
stakeControl.updateValueAndValidity();
})
更新:
this.betsForm = this.createFormGroup(this.betSlipItems);
this.betsForm.get('isSelected').valueChanges.subscribe(value => { // console error here: TypeError: Cannot read property 'valueChanges' of null
const stakeControl = this.betsForm.get('stake');
if (value === false) {
stakeControl.setValidators([Validators.min(1), Validators.required]);
} else {
stakeControl.clearValidators();
}
stakeControl.updateValueAndValidity();
});