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

Posted

技术标签:

【中文标题】如何在 Angular2 中触发表单验证器【英文标题】:How to trigger Form Validators in Angular2 【发布时间】:2015-11-22 11:13:46 【问题描述】:

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

示例: 给定复选框 X 并输入 P。 输入 P 有一个基于 X 的模型值行为不同的验证器。 当 X 被选中/取消选中时,我需要调用 P 上的验证器。P 上的验证器将查看模型以确定 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 的值启用/禁用验证?您使用的是哪种验证器?您可以根据您范围内的条件使验证器执行,但我不确定该方法是否适合您。见:***.com/questions/21370006/… @stephen.vakil - 我正在使用 angular2。 @Bonneville 你能解释一下你是如何将复选框状态传递给验证器函数的吗? 【参考方案1】:

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

看看这个:Angular 2 - AbstractControl

我认为你可以做的是:

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

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

希望这会有所帮助!

Validaton-Guide

FormControl Documentation

【讨论】:

感谢@Nightking 的建议,我会试试的。请注意,您的链接无效。 @Bonneville 感谢您提供信息。他们将表单代码提取到公共命名空间。事情的变化有点快:)。我已经更新了源链接。 我终于开始使用这段代码,它似乎对我有用。谢谢!顺便说一句,您的代码中有一个错字:updateValueAndValidity() 函数中缺少字母“e”。您的代码有更新而不是更新。干杯,这是一个很大的帮助! 链接已损坏;可能会更新为github.com/angular/angular/blob/master/packages/forms/src/…,虽然不完全相同。也可以链接到 Angular 文档 救命稻草!!我被卡住的用例是当用户提交表单而不触及单个表单控件时。表单无效,但控件未显示任何错误消息【参考方案2】:

使用我的 ControlGroup 我这样做是因为我有错误 div 检查是否被触摸

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

(this.form 是我的控制组)

【讨论】:

这实际上是正确的答案。如果你想单输入 this.form.controls['name'].markAsTouched();【参考方案3】:

借助本博客

blog link

我遇到了一个结合夜王答案的解决方案

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

);

this.orderForm 是表单组

【讨论】:

【参考方案4】:

这对我有用

this.myForm.markAllAsTouched();

【讨论】:

标记为已触摸的问题是,如果您正在跟踪更改,例如在离开时告诉他们有未保存的更改,那么这将触发该逻辑【参考方案5】:

有更优雅的方法来建模这种行为 - 例如,将您的状态放入 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
  );

【讨论】:

【参考方案6】:

您可以通过这种方式触发验证:

this.myform.get('myfield').updateValueAndValidity();

【讨论】:

【参考方案7】:
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);
        
    ;

【讨论】:

以上是关于如何在 Angular2 中触发表单验证器的主要内容,如果未能解决你的问题,请参考以下文章

Angular2获取表单控件的现有验证器

Angular 2 / 如何防止 IE 触发自动输入验证?

Angular 2 表单验证器弄乱了取消按钮

如何在 Angular 2 中添加表单验证模式?

验证模板表单中的复选框列表(不是反应式表单)Angular 2

如何使用 Angular 2 在单个 ts 文件中编写 2 个表单验证?