Angular 2 FormGroup 添加动态验证器
Angular 2 FormGroup Add Validators dynamic
我正在尝试将验证器添加到 FormContol 动态(不是在初始化时),但它不起作用....
代码:
this.formGroup.controls["firstName"].validator = Validators.Required;
有人做过吗?
试试这个,它应该有效
this.formGroup.controls["firstName"].setValidators(Validators.required);
对于多个验证者
this.formGroup.controls["firstName"].setValidators([Validators.required, Validators.minLength(2)]);
但是这样做会覆盖初始化期间提供的任何验证器
编辑:
为了立即反映新添加的表单控件Validators
,我们必须在动态设置验证器后调用this.formGroup.controls["firstName"].updateValueAndValidity();
。
this.formGroup.controls["firstName"].setValidators(Validators.required);
this.formGroup.controls["firstName"].updateValueAndValidity();
DEMO 同样
* 注意 *
updateValueAndValidity() 将触发 valueChanges 事件,即使值没有真正改变(如果您从 valueChanges 订阅中调用它,可能会导致无限循环)。您可以通过使用可选参数对象来防止这种情况:{ onlySelf: true, emitEvent: false}
虽然 Amit Chigadani 的回答是正确的,但请记住以下几点。
虽然此解决方案适用于更新验证器,但新验证器本身不会 运行,直到您更改表单字段值。因此建议 运行 在更新验证器后立即使用以下函数 ;)
通俗地说:添加行,如果您希望 ng-valid 和 ng-invalid 类 自行更新。
this.formGroup.controls["firstName"].setValidators([Validators.required, Validators.minLength(2)]);
this.formGroup.controls["firstName"].updateValueAndValidity();
如果您只想更新此单个控件的值和有效性,则添加此选项
this.formGroup.controls["firstName"].setValidators([Validators.required, Validators.minLength(2)]);
this.formGroup.controls["firstName"].updateValueAndValidity({onlySelf: true});
另一个旁注。在 Angular2 中,不应该使用数组语法来获取表单组控件,但是这个
this.formGroup.get("firstName");
也接受点符号
this.formGroup.get("userSectionFormGroup.firstName");
得到了我们可以用下面的代码做的解决方案。
const validators = new Array<Validators>();
validations.forEach(validation => {
switch (validation.Type) {
case 'required':
validators.push(Validators.required);
break;
case 'minLength':
validators.push(Validators.minLength(parseInt(validation.Expression, 10)));
break;
case 'maxLength':
validators.push(Validators.maxLength(parseInt(validation.Expression, 10)));
break;
case 'pattern':
validators.push(Validators.pattern(validation.Expression));
break;
}
});
this.form.controls[i].setValidators(validators);
}
}
});
我最终使用了:
export function getValidatorFnArray(obj): ValidatorFn[] {
const validators = [];
if (obj.required || obj.required === '' ) {
validators.push(Validators.required);
}
if (obj.minLength) {
validators.push(Validators.minLength(parseInt(obj.minLength, 10)));
}
if (obj.maxLength) {
validators.push(Validators.maxLength(parseInt(obj.maxLength, 10)));
}
if (obj.pattern) {
validators.push(Validators.pattern(obj.pattern));
}
if (obj.email || obj.email === '') {
validators.push(Validators.email);
}
return validators
}
其中 obj
可能是这样的:
validation: {
required: '',
pattern: '\d+',
}
我正在尝试将验证器添加到 FormContol 动态(不是在初始化时),但它不起作用....
代码:
this.formGroup.controls["firstName"].validator = Validators.Required;
有人做过吗?
试试这个,它应该有效
this.formGroup.controls["firstName"].setValidators(Validators.required);
对于多个验证者
this.formGroup.controls["firstName"].setValidators([Validators.required, Validators.minLength(2)]);
但是这样做会覆盖初始化期间提供的任何验证器
编辑:
为了立即反映新添加的表单控件Validators
,我们必须在动态设置验证器后调用this.formGroup.controls["firstName"].updateValueAndValidity();
。
this.formGroup.controls["firstName"].setValidators(Validators.required);
this.formGroup.controls["firstName"].updateValueAndValidity();
DEMO 同样
* 注意 *
updateValueAndValidity() 将触发 valueChanges 事件,即使值没有真正改变(如果您从 valueChanges 订阅中调用它,可能会导致无限循环)。您可以通过使用可选参数对象来防止这种情况:{ onlySelf: true, emitEvent: false}
虽然 Amit Chigadani 的回答是正确的,但请记住以下几点。
虽然此解决方案适用于更新验证器,但新验证器本身不会 运行,直到您更改表单字段值。因此建议 运行 在更新验证器后立即使用以下函数 ;)
通俗地说:添加行,如果您希望 ng-valid 和 ng-invalid 类 自行更新。
this.formGroup.controls["firstName"].setValidators([Validators.required, Validators.minLength(2)]);
this.formGroup.controls["firstName"].updateValueAndValidity();
如果您只想更新此单个控件的值和有效性,则添加此选项
this.formGroup.controls["firstName"].setValidators([Validators.required, Validators.minLength(2)]);
this.formGroup.controls["firstName"].updateValueAndValidity({onlySelf: true});
另一个旁注。在 Angular2 中,不应该使用数组语法来获取表单组控件,但是这个
this.formGroup.get("firstName");
也接受点符号
this.formGroup.get("userSectionFormGroup.firstName");
得到了我们可以用下面的代码做的解决方案。
const validators = new Array<Validators>();
validations.forEach(validation => {
switch (validation.Type) {
case 'required':
validators.push(Validators.required);
break;
case 'minLength':
validators.push(Validators.minLength(parseInt(validation.Expression, 10)));
break;
case 'maxLength':
validators.push(Validators.maxLength(parseInt(validation.Expression, 10)));
break;
case 'pattern':
validators.push(Validators.pattern(validation.Expression));
break;
}
});
this.form.controls[i].setValidators(validators);
}
}
});
我最终使用了:
export function getValidatorFnArray(obj): ValidatorFn[] {
const validators = [];
if (obj.required || obj.required === '' ) {
validators.push(Validators.required);
}
if (obj.minLength) {
validators.push(Validators.minLength(parseInt(obj.minLength, 10)));
}
if (obj.maxLength) {
validators.push(Validators.maxLength(parseInt(obj.maxLength, 10)));
}
if (obj.pattern) {
validators.push(Validators.pattern(obj.pattern));
}
if (obj.email || obj.email === '') {
validators.push(Validators.email);
}
return validators
}
其中 obj
可能是这样的:
validation: {
required: '',
pattern: '\d+',
}