有一种更通用的方法可以用于多种目的,而不仅仅是这个。
每次您想有条件地将 Validators.required 添加到控件时,您都可以使用此函数。
首先创建这个函数(在服务中应该是最好的主意,因为它是通用的,所以你可以稍后在不同的组件中以不同的条件使用它,但对于示例它在同一个组件中)
import { FormGroup, Validators } from '@angular/forms';
conditionallyRequiredValidator(masterControlLabel: string, operator: string, conditionalValue: any, slaveControlLabel: string) {
return (group: FormGroup): {[key: string]: any} => {
const masterControl = group.controls[masterControlLabel];
const slaveControl = group.controls[slaveControlLabel];
if (eval(`'${masterControl.value}' ${operator} '${conditionalValue}'`)) {
return Validators.required(slaveControl)
}
slaveControl.setErrors(null);
return null;
}
}
masterControlLabel:将有条件地将 Validators.required 添加到 slaveControl
的控件
operator:您想用来比较 masterControl 值与 conditionalValue
的运算符
conditionalValue:您希望 masterControl 值必须匹配的值才能有条件地将验证器添加到 slaveControl
slaveControlLabel:将接收(或不接收)条件 Validators.required
的控件
第二个也是最后一个,像这样在你的 formGroup 中添加验证器参数(或验证器参数,如果需要进行多重验证):
import { FormBuilder, FormGroup, Validators } from "@angular/forms";
constructor(
private angularFormBuilder: FormBuilder,
){ }
myFormGroup: FormGroup = this.angularFormBuilder.group({
age: ['', Validators.required],
licenceNo: [''],
}, {validator: conditionallyRequiredValidator('age', '>=', 18, 'licenceNo')});
在此示例中,如果年龄严格超过或等于 18 岁,则 licenceNo 控件将有条件地要求