Angular如何在创建控件后将Validator添加到FormControl?

时间:2016-08-05 20:34:50

标签: forms angular

我们有一个具有动态构建表单的组件。使用验证器添加控件的代码可能如下所示

var c = new FormControl('', Validators.required);

但是,我想说我想稍后添加第二个Validator 。我们怎样才能做到这一点?我们无法在线找到任何相关文档。我确实发现虽然在表单控件中有setValidators

this.form.controls["firstName"].setValidators 

但不清楚如何添加新的或自定义验证器。

非常感谢。

7 个答案:

答案 0 :(得分:57)

您只需将FormControl传递给验证器数组。

以下是一个示例,说明如何向现有FormControl添加验证器:

this.form.controls["firstName"].setValidators([Validators.minLength(1), Validators.maxLength(30)]);

注意,这将重置您在创建FormControl时添加的任何现有验证器。

答案 1 :(得分:45)

添加@Delosdos发布的内容。

设置 FormGroup中控件的验证程序:     this.myForm.controls['controlName'].setValidators([Validators.required])

从FormGroup中的控件中删除验证程序: this.myForm.controls['controlName'].clearValidators()

运行上述任一行后,

更新 FormGroup。 this.myForm.controls['controlName'].updateValueAndValidity()

这是以编程方式设置表单验证的一种惊人方式。

答案 2 :(得分:27)

如果您正在使用reactFormFormModule并具有如下定义的formGroup:

public exampleForm = new FormGroup({
        name: new FormControl('Test name', [Validators.required, Validators.minLength(3)]),
        email: new FormControl('test@example.com', [Validators.required, Validators.maxLength(50)]),
        age: new FormControl(45, [Validators.min(18), Validators.max(65)])
});

您可以使用以下方法向FormControl添加新的验证器(并保留旧的验证器):

this.exampleForm.get('age').setValidators([
        Validators.pattern('^[0-9]*$'),
        this.exampleForm.get('age').validator
]);
this.exampleForm.get('email').setValidators([
        Validators.email,
        this.exampleForm.get('email').validator
]);

FormControl.validator返回一个包含所有先前定义的验证器的组合验证器。

答案 3 :(得分:0)

我认为所选答案不正确,因为最初的问题是“如何在创建formControl之后添加新的验证器”。

据我所知,这是不可能的。您唯一可以做的就是动态创建验证者数组。

但是我们想念的是拥有一个函数addValidator()来不覆盖已经添加到formControl的验证器。

如果有人对此要求有答案,可以在这里发布。

谢谢

答案 4 :(得分:0)

除了爱德华·沃德(Eduard Void)的答案以外,还有addValidators方法:

declare module '@angular/forms' {
  interface FormControl {
    addValidators(validators: ValidatorFn[]): void;
  }
}

FormControl.prototype.addValidators = function(this: FormControl, validators: ValidatorFn[]) {
  if (!validators || !validators.length) {
    return;
  }

  this.clearValidators();
  this.setValidators( this.validator ? [ this.validator, ...validators ] : validators );
};

使用它,您可以动态设置验证器:

some_form_control.addValidators([ first_validator, second_validator ]);
some_form_control.addValidators([ third_validator ]);

答案 5 :(得分:0)

一个简单的解决方案是首先获取表单控件中的所有验证器,并在需要的代码将像这样运行时为其分配一个新的 validatorFn。

//get existing validators and assign a new validator

const formControl = this.form.controls["firstName"];

 const validators: ValidatorFn[] = !!formControl.validator ?
  [formControl.validator, Validators.required] :
  [Validators.required];

formControl.setValidators(validators);

formControl.validtor 保存现有的验证器(不是 asyncValidators) 我们使用三元检查它是否不为 null 并添加到它(这里我们向它添加所需的验证器),否则,我们只需分配我们的新验证器

答案 6 :(得分:0)

如果您需要删除添加的表单控件上的一些现有验证,请在控件上调用以下函数

<块引用>

this.form.controls["name"].clearValidators();

之后你需要调用下面的函数来更新表单控件,它会立即对表单控件生效。

<块引用>

this.form.controls['name'].updateValueAndValidity();

如果您需要在已添加的表单控件上添加一些验证,请在控件上调用以下函数

<块引用>

this.signupForm.controls['name'].setValidators([Validators.required]);

在那次通话之后

<块引用>

.updateValueAndValidity()

立即发挥作用,立即反映。