【问题标题】:Conditional required validator directive in Angular 2Angular 2 中的条件验证器指令
【发布时间】:2016-05-02 15:41:59
【问题描述】:

我需要根据其他字段的值来设置某些表单字段是否必填。内置的RequiredValidator 指令似乎不支持这一点,所以我创建了自己的指令:

@Directive({
  selector: '[myRequired][ngControl]',
  providers: [new Provider(NG_VALIDATORS, { useExisting: forwardRef(() => MyRequiredValidator), multi: true })]
})
class MyRequiredValidator {
  @Input('myRequired') required: boolean;

  validate(control: AbstractControl): { [key: string]: any } {
    return this.required && !control.value
      ? { myRequired: true }
      : null;
  }
}

示例用法:

<form>
  <p><label><input type="checkbox" [(ngModel)]="isNameRequired"> Is Name Required?</label></p>
  <p><label>Name: <input type="text" [myRequired]="isNameRequired" #nameControl="ngForm" ngControl="name" [(ngModel)]="name"></label></p>
  <p *ngIf="nameControl.control?.hasError('myRequired')">This field is required.</p>
</form>

如果用户首先切换复选框然后在文本框中键入或删除文本,则此方法可以正常工作。但是,如果用户在文本框为空白时切换复选框,则验证消息不会正确更新。

如何修改MyRequiredValidator 以在其required 属性更改时触发验证?

注意:我正在寻找仅涉及更改 MyRequiredValidator 的解决方案。我想避免向 App 组件添加任何逻辑。

Plunker:https://plnkr.co/edit/ExBdzh6nVHrcm51rQ5Fi?p=preview

【问题讨论】:

  • #nameControl="ngForm" 不会出现在
    标签上,而不是 标签上?
  • @RonNewcomb:在 Angular 2 时代(当我发布这个问题时),NgModel 指令将自身导出为ngForm,这在&lt;input&gt; 标签上非常令人困惑。此后已更改为ngModel

标签: validation typescript angular angular2-directives


【解决方案1】:

我会使用类似的东西:

@Directive({
  selector: '[myRequired][ngControl]',
  providers: [new Provider(NG_VALIDATORS, { useExisting: forwardRef(() => MyRequiredValidator), multi: true })]
})
class MyRequiredValidator {
  @Input('myRequired') required: boolean;

  ngOnChanges() {
    // Called when required is updated
    if (this.control) {
      this.control.updateValueAndValidity();
    }
  }

  validate(control: AbstractControl): { [key: string]: any } {
    this.control = control;
    return this.required && !control.value
      ? { myRequired: true }
      : null;
  }
}

看到这个 plunkr:https://plnkr.co/edit/14jDdUj1rdzAaLEBaB9G?p=preview

【讨论】:

  • 这似乎有效。但是在更复杂的情况下,在ngOnChanges 中调用updateValueAndValidity 是否有可能导致错误"Expression '...' has changed after it was checked."? (我不太了解导致此错误的确切情况。)
  • 事实上,如果我将消息的 &lt;p&gt; 移动到复选框的 &lt;p&gt; 之前,那么当我切换复选框时,我确实会收到该错误。
  • @MichaelLiu Liu 这样就需要在updateValueAndValidity后面加上this.cdr.detectChanges()。基于stackoverflow.com/questions/34364880/…
猜你喜欢
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 2018-02-20
  • 2020-09-19
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多