如何在Angular2中触发表单验证器


80

在angular2中,当另一个控件发生更改时,我想触发某些控件的验证器。有什么办法可以让我告诉表单重新验证?更妙的是,我可以要求验证特定字段吗?

示例:假设复选框X和输入P.输入P有不同的行为基于X时,选中/取消我需要调用P上验证P上的验证将着眼于模型X的模型值的验证确定X的状态并相应地验证P。

这是一些代码:

constructor(builder: FormBuilder) {
    this.formData = { num: '', checkbox: false };

    this.formGp = builder.group({
        numberFld: [this.formData.num, myValidators.numericRange],
        checkboxFld: [this.formData.checkbox],
    });
}

this.formGp.controls['checkboxFld'].valueChanges.observer({
    next: (value) => {
        // I want to be able to do something like the following line:
        this.formGp.controls['numberFld'].validator(this.formGp.controls['numberFld']);
    }
});

有人有解决办法吗?谢谢!


您是否只是尝试基于X的值启用/禁用验证?您使用哪种验证器?您可以根据您的范围中的条件使验证程序执行,但是我不确定该方法是否对您有用。请参阅: stackoverflow.com/questions/21370006/...
stephen.vakil

@ stephen.vakil-我正在使用angular2。
2015年

@Bonneville您能解释一下如何将复选框状态传递给验证器功能吗?
Varun Mulloli

Answers:


78

我不知道您是否还在寻找答案,所以这是我的建议:

看看这个:Angular 2-AbstractControl

我认为您可以采取以下行动:

this.formGp.controls['checkboxFld'].valueChanges.observer({
    next: (value) => {
       this.formGp.controls['numberFld'].updateValueAndValidity();
    }
});

这应该触发并运行验证器。此外,状态也会更新。现在,您应该能够在验证器逻辑中查询复选框的值。

希望这可以帮助!

编辑:更新了链接和示例。我编写答案时代码已更改。

EDIT_2:alpha.48将EventEmitter.observer更改为EventEmitter.subscribe!

EDIT_3:更改了指向实际实现的链接,添加了指向文档的链接

验证指南

FormControl文档


感谢@Nightking的建议,我会尝试一下。请注意,您的链接无效。
Bonneville

@Bonneville感谢您提供信息。他们将表单代码提取到公共名称空间。事情变得有点快:)。我已经更新了到源的链接。
Nightking

我终于开始使用这段代码,它似乎对我有用。谢谢!顺便说一句,您的代码中有一个错字:updateValueAndValidity()函数中字母'e'丢失了。您的代码已更新,而不是更新。干杯,这是很大的帮助!
Bonneville

1
链接断开;可能会更新到github.com/angular/angular/blob/master/packages/forms/src/…,尽管并不完全相同。也可以链接到Angular文档
Explosion Pills

1
救命!!我被困住的用例是用户提交表单而不触摸单个表单控件。表单无效,但控件未显示任何错误消息
pravin

40

与我的ControlGroup之所以这样做,是因为我在检查是否触摸div时出错

for (var i in this.form.controls) {
  this.form.controls[i].markAsTouched();
}

(this.form是我的ControlGroup)


这实际上是正确的答案。如果要单个输入this.form.controls ['name']。markAsTouched();
chris_r

18

在这个博客的帮助下

博客链接

我遇到了结合Nightking答案的解决方案

Object.keys(this.orderForm.controls).forEach(field => {
       const control = this.orderForm.get(field);
       control.updateValueAndValidity();

});

this.orderForm是表单组



6

可以使用更优雅的方式对此行为进行建模-例如,将您的状态放入ReplaySubject并进行观察,然后使用异步验证器观察该状态-但下面的伪编码方法应该可以使用。您只需观察复选框中值的变化,适当地更新模型,然后使用updateValueAndValidity cal强制对numberFld进行重新验证。

constructor(builder: FormBuilder) {
  this.formData = { num: '', checkbox: false };
  const numberFld = builder.control(this.formData.num, myValidators.numericRange);

  const checkbox = builder.control(this.formData.checkbox);
  checkbox.valueChanges.map(mapToBoolean).subscribe((bool) => {
    this.formData.checked = bool;
    numberFld.updateValueAndValidity(); //triggers numberFld validation
  });

  this.formGp = builder.group({
      numberFld: numberFld,
      checkboxFld: checkbox
  });
}

0
static minMaxRange(min: number, max: number): ValidatorFn {
    return (control: AbstractControl): ValidationErrors | null => {
        if (Validators.min(min)(control)) { // if min not valid
            return Validators.min(min)(control);
        } else {
            return Validators.max(max)(control);
        }
    };
}
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.