validation - Angular 2 中的条件必需验证器指令

标签 validation typescript angular angular2-directives

我需要根据其他字段的值来确定某些表单字段是否必填。内置 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 组件添加任何逻辑。

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

最佳答案

我会使用类似的东西:

@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;
  }
}

查看此插件:https://plnkr.co/edit/14jDdUj1rdzAaLEBaB9G?p=preview .

关于validation - Angular 2 中的条件必需验证器指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36986375/

相关文章:

javascript - 如何在 Asp.net mvc 中使用 Angular 插入系统日期和其他数据

angular - 私有(private)实例成员函数声明后不允许出现公共(public)实例成员函数的声明

C# - 文本框验证

jquery - jquery验证的问题

json - 为什么 TypeScript 编译器会忽略 tsconfig.json?

javascript - 请解释 Angular 2 中的 "#variable"与 "let variable"

java - 在 java 中解析 XML 时没有工作 ID 属性

python - 如何使用 pyparsing 验证 bool 表达式语法?

javascript - 将样式 css 转换为 scss

node.js - 您的全局 Angular CLI 版本 (6.0.8) 高于本地版本 (1.0.2)