【问题标题】:Check if input control has certain type of vallidator in angular2检查输入控件是否在 angular2 中具有某种类型的验证器
【发布时间】:2016-04-23 22:15:45
【问题描述】:

我有包装输入字段的组件。在组件中,我收到来自@Input() inputControl: Control;Control 对象。在模板中,如果不需要组件中的输入字段,我有显示消息的跨度。

<span
  class="input-label-caption">
  (optional)
</span>

和输入

<input
    *ngIf="inputMode=='text' || inputMode=='email'"
    type="{{inputMode}}"
    [ngFormControl]="inputControl"
    placeholder="{{placeholder}}"
    class="input-text"
    [disabled]="inputDisabled"
    [ngClass]="{
    'inverted': inverted
    }">

如果inputControl 对象包含Validators.required,我如何读取它? 我想知道我是否可以像这样使用它

<span
  class="input-label-caption"
  *ngIf="!inputControl.validators.required"
  >
  (optional)
</span>

【问题讨论】:

    标签: typescript angular angular2-forms


    【解决方案1】:

    有点晚了,但对我有用的是检查控件是否具有validatorasyncValidator 方法。这样你就知道控件是否有一些同步验证器或一些异步验证器。 然后,如果您想知道调用了该方法的验证器。

    同步验证器:

    const getSyncValidators= (control: FormControl) => {
       if(control.validator) {
         return control.validator({} as AbstractControl);
       };
    };
    

    异步验证:

    const getAsyncValidators= (control: FormControl) => {
       if(control.asyncValidator) {
         return control.asyncValidator({} as AbstractControl);
       };
    };
    

    对于异步验证器,您会得到一个 observable,您看不到异步验证器的名称。

    如果您只想知道它有一个异步验证器,这是一种简单的方法。

    始终检查 control.validator 或 control.asyncValidator 是否存在,因为没有任何验证器的控件会因为函数不存在而引发错误。

    【讨论】:

      【解决方案2】:

      考虑到自一月份以来对 Angular 的更改,我无法使上述工作正常工作,这并不奇怪。使用最新版本的 Angular (2.2.0),你的课堂上将需要这样的东西。

        get required(): boolean { 
          var _validator: any = this.inputControl.validator && this.inputControl.validator(this.inputControl);
          return _validator && _validator.required;
        }
      

      这也将处理您有多个反应形式的验证器的情况,例如

            name: ['', [Validators.required, Validators.minLength(2)]]
      

      【讨论】:

      • 我尝试测试您的代码,但 _validator 始终为空,我使用的是 angular 2.4,在 angular 2.4 上使用您的代码是否有任何更改?谢谢。
      • 我解决了我的问题,创建了一个新的 FormControl 并将其作为参数传递给验证器......就像这样:get required(): boolean { var _validator: any = this.inputControl.validator && this .inputControl.validator(new FormControl());返回 _validator && _validator.required;我不知道这是否是最好的方法,但它对我有用。
      【解决方案3】:

      你可以尝试使用这个表达式:

      <span
        class="input-label-caption"
        *ngIf="!inputControl.errors?.required"
      >
        (optional)
      </span>
      

      errors 属性包含每个失败的验证器名称的条目。

      我将 Elvis 运算符用于 errors 属性,因为如果没有验证错误,它可以是未定义的。

      编辑

      根据您的评论,我认为您可以使用 === 运算符和 Validators.required 函数直接检查“必需”验证器。事实上,验证器只是一个函数,Validators.required 函数用于“必需”验证。

      下面是对应的代码:

      this.hasRequiredValidator = (this.inputControl.validator === Validators.required);
      

      如果validator属性是一个数组,你需要扩展一点测试来检查数组中是否存在Validators.required函数。

      现在模板中的代码是:

      (可选的)

      希望对你有帮助 蒂埃里

      【讨论】:

      • 您好蒂埃里,感谢您的帮助。我试过你的想法,它部分工作。当组件初始化时它工作正常,因为Control 对象中存在错误但是当我在输入中写一些东西时inputControl.errors 看起来像这样{ required: false } 因为输入中不再有错误并且消息再次显示.
      • 好的,我看到了问题 ;-) 我认为你应该直接测试验证器。我相应地更新了我的答案...希望它能解决您的问题...
      • 我解决了。谢谢你的帮助。这行代码成功了 if(this.inputControl.validator &amp;&amp; this.inputControl.validator(Validators.required)) { this.inputRequired = true; } 我将在几天内将其置之不理,因为也许有人会为该问题提供更优雅的解决方案。
      • 如果函数接受参数,你将无法使用它,对吗?
      猜你喜欢
      • 2012-10-02
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 2012-09-17
      相关资源
      最近更新 更多