Jon*_*Sud 16 javascript typescript angular angular-reactive-forms
我有一个反应式表单,并根据fooRequired我想要将字段设置为必填或非必填的属性。
我无法更改它,因为它是初始设置的。那我能做什么呢?
fooRequired = false;
form = new FormGroup({
foo: new FormControl(null, [Validators.required])
});
toggle() { this.fooRequired = !this.fooRequired; }
Run Code Online (Sandbox Code Playgroud)
Nic*_*s K 21
下面的方法可以解决这个问题:
toggle() {
this.fooRequired = !this.fooRequired;
this.form.controls.foo.setValidators(this.fooRequired ? null : [Validators.required]);
this.form.controls.foo.updateValueAndValidity();
}
Run Code Online (Sandbox Code Playgroud)
在这里,根据fooRequired布尔值,设置或删除验证器。最后,更新了新的表单控件设置。
您可以使用自定义函数来负责添加或删除Validators
export function conditionalValidator(
predicate: BooleanFn,
validator: ValidatorFn,
errorNamespace?: string
): ValidatorFn {
return formControl => {
if (!formControl.parent) {
return null;
}
let error = null;
if (predicate()) {
error = validator(formControl);
}
if (errorNamespace && error) {
const customError = {};
customError[errorNamespace] = error;
error = customError;
}
return error;
};
}
Run Code Online (Sandbox Code Playgroud)
然后你可以在表单控件中使用它:
this.myForm = this.fb.group({
myEmailField: [
"",
[
// some normal validatiors
Validators.maxLength(250),
Validators.minLength(5),
Validators.pattern(/.+@.+\..+/),
// custom validation
conditionalValidator(
// depends on fooRequired value
() => this.fooRequired,
Validators.required,
"illuminatiError"
)
]
]
});
Run Code Online (Sandbox Code Playgroud)
最后您可以切换 的值fooRequired并查看结果:
toggle() {
this.fooRequired = !this.fooRequired;
this.myForm.get("myEmailField").updateValueAndValidity();
}
Run Code Online (Sandbox Code Playgroud)
这是一个现场演示,可以帮助您实现上述答案
| 归档时间: |
|
| 查看次数: |
18958 次 |
| 最近记录: |