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

mel*_*ant 60 forms angular angular-reactive-forms

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

var c = new FormControl('', Validators.required);
Run Code Online (Sandbox Code Playgroud)

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

this.form.controls["firstName"].setValidators 
Run Code Online (Sandbox Code Playgroud)

但目前尚不清楚如何添加新的或自定义验证器.

谢谢一堆.

And*_*dos 76

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

这是一个示例,说明如何将验证器添加到现有FormControl:

this.form.controls["firstName"].setValidators([Validators.minLength(1), Validators.maxLength(30)]);
Run Code Online (Sandbox Code Playgroud)

请注意,这将重置您在创建FormControl时添加的任何现有验证程序.

  • 设置新验证器后,我还必须在表单控件上调用“.updateValueAndValidity()”。 (13认同)
  • 哈...有时候你会看到这么久的东西,最好还是离开.谢谢!! (4认同)
  • this.form.controls [ "名字"].clearValidators() (4认同)
  • 有什么方法可以做到而又不超越旧的?或以任何方式附加新的? (3认同)
  • 有没有办法删除验证 (2认同)

sha*_*urg 55

添加@Delosdos发布的内容.

在以下位置为控件设置验证器FormGroup: this.myForm.controls['controlName'].setValidators([Validators.required])

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

运行上述任一行后,请更新 FormGroup. this.myForm.controls['controlName'].updateValueAndValidity()

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

  • 我使用的是Angular 6,没有`updateValueAndValidity`就无法使其正常工作。谢谢@shammelburg! (4认同)
  • 对我来说,它在没有最后一行的情况下工作,我很确定 Angular 的新版本现在自己更新表单有效性。但是感谢您告诉我们关于 `updateValueAndValidity` 方法,有一天可能会派上用场! (3认同)

Edu*_*oid 40

如果您正在使用reactiveFormModule并且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)])
});
Run Code Online (Sandbox Code Playgroud)

你可以使用这种方法向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
]);
Run Code Online (Sandbox Code Playgroud)

FormControl.validator返回包含所有先前定义的验证器的撰写验证器.

  • Imo这应该是公认的答案.它演示了如何添加像OP请求的验证器,还向您展示了如何保留以前设置的验证器; 这是我在阅读接受的答案之后用Google搜索的第一件事,因为我不想覆盖我已经拥有的一些验证器,但仍然需要以编程方式添加其他验证器.谢谢你的回答@Eduard Void (9认同)
  • 我同意我的前任。问题是如何“添加”新的验证器来控制表单,而不是如何“替换”它。 (3认同)
  • 我做了`control.setValidators(control.validator?[control.validator,Validators.email]:Validators.email);`来进行严格的null检查 (2认同)

luc*_*r63 7

除了 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;
  }

  const old_validator = this.validator;

  this.clearValidators();
  this.setValidators( old_validator ? [ old_validator , ...validators ] : validators );
};
Run Code Online (Sandbox Code Playgroud)

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

some_form_control.addValidators([ first_validator, second_validator ]);
some_form_control.addValidators([ third_validator ]);
Run Code Online (Sandbox Code Playgroud)


小智 7

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

this.form.controls["name"].clearValidators();
Run Code Online (Sandbox Code Playgroud)

之后,您需要调用以下函数来更新表单控件,它将立即在表单控件上生效。

this.form.controls['name'].updateValueAndValidity();
Run Code Online (Sandbox Code Playgroud)

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

this.signupForm.controls['name'].setValidators([Validators.required]);
Run Code Online (Sandbox Code Playgroud)

之后updateValueAndValidity()立即调用函数,这样就可以立即反映出来。


use*_*476 5

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

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

但我们缺少的是有一个函数 addValidator() 来不覆盖已经添加到 formControl 的验证器。如果有人对此要求有答案,很高兴在此发布。

  • 你可能会认为“control.setValidators(control.validator ? [ control.validator, Validators.email ] : Validators.email);”会起作用。 (2认同)
  • 请参阅@Eduard Void的答案/sf/answers/3729377081/ (2认同)