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


84

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

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

但是,假设我要稍后添加2nd Validator 。我们怎样才能做到这一点?我们在线上找不到任何文档。我确实发现,尽管在表单控件中有setValidators

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

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

Answers:


109

您只需向FormControl传递一个验证器数组。

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

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

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


5
哈...有时候你看的东西太久了,最好还是走开。谢谢!!
优美的

1
有没有办法删除验证
Abhijith ss

6
有什么方法可以做到而又不超越旧的?或以任何方式附加新的?
danday74 '18 -10-15

1
@ danday74,请在此问题的底部查看Eduard Void的答案。应该接受答案imo。他解释了如何做您需要知道的事情,我也需要知道如何做。
克里斯(Chris)

6
.updateValueAndValidity()设置新的验证器后,我还必须调用表单控件。
基隆

82

添加到@Delosdos发布的内容上。

在中为控件设置验证器FormGroupthis.myForm.controls['controlName'].setValidators([Validators.required])

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

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

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


1
对我来说,它没有最后一行就可以工作,我很确定Angular的新版本现在可以自己更新表单有效性。但是感谢您向我们介绍该updateValueAndValidity方法,有一天可能会派上用场!
Nino Filiu

@NinoFiliuupdateValueAndValidity仍用于执行验证,并且在较新版本的Angular中没有任何不同的处理方式。发生的事情是setValidators更新验证器,但不运行验证检查,然后您使用它updateValueAndValidity来执行验证。您必须将验证器设置在变更检测为您处理的位置,但是您会发现updateValueAndValidity在组或控件上使用的方式取决于您刚刚设置的关键验证器-github.com/angular/angular/issues/19622#issuecomment- 341547884
mtpultz '18

4
我使用的是Angular 6,如果没有,则无法使其正常工作updateValueAndValidity。谢谢@shammelburg!
Oli Crt '18

1
在Angular 7上,如果没有最后一个更新行,它也对我不起作用。
大卫·芬德利

是。没有updateValueAndValidity(),它可以工作,但是在某些情况下,它不能。如果添加updateValueAndValidity()之后setValidators()它将立即影响与控件相关的更改。因此最好添加updateValueAndValidity()。
Jamith NImantha

71

如果您正在使用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返回一个包含所有先前定义的验证器的撰写验证器。


12
伊莫这应该是公认的答案。它演示了如何添加请求的OP之类的验证器,还向您展示了如何保留先前设置的验证器;在阅读完接受的答案之后,这是我搜索Google的第一件事,因为我不想覆盖已经拥有的一些验证器,但是仍然需要以编程方式添加其他验证器。谢谢你的回答@Eduard Void
克里斯

3
我同意我的前任。问题是如何在表单中添加新的验证器,而不是如何替换它。
Plusce

5
我确实control.setValidators(control.validator ? [ control.validator, Validators.email ] : Validators.email);避开了严格的null检查
William Lohan

3

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

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

但是我们错过的是拥有一个函数addValidator()来不覆盖已经添加到formControl的验证器。如果有人对此要求有答案,可以在这里发布。


1
您会认为control.setValidators(control.validator ? [ control.validator, Validators.email ] : Validators.email);会工作。
威廉·罗韩


3

除了爱德华·沃德(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 ]);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.