【问题标题】:How to differentiate multiple Validators.pattern如何区分多个Validators.pattern
【发布时间】:2018-07-28 08:27:32
【问题描述】:

我有一个用户需要输入经度的输入。当用户输入 NaNNot-Precise-Enough 值时,我希望能够显示不同的错误消息。我正在使用FormControl.hasError('ValidatorsName') 来获取验证错误,但似乎我无法区分这些模式。

模板:

<mat-form-field class="form-field">
    <input matInput placeholder="Logitude" [formControl]="longitude">
    <mat-error *ngIf="longitude.hasError('pattern')">
        Longitude must be <strong>a number</strong>
    </mat-error>
    <!-- I want to be able to check patter2 for example -->
    <mat-error *ngIf="longitude.hasError('pattern')"> 
        Longitude must have <strong>a minimum of 5 decimal numbers</strong>
    </mat-error>
</mat-form-field>

还有我的 Angular 代码:

this.longitude = new FormControl(this.attraction.longitude, [
    // is valid number
    Validators.pattern(new RegExp('(\d{1,3})([.|,]{,1})(\d+))','gi')),
    // is precise enough
    Validators.pattern(new RegExp('(\-{0,1})(\d{1,3})([.|,]{1})(\d{5,13})','i'))
]);

有没有办法给这些模式一个标识符?如有任何帮助,我将不胜感激。

【问题讨论】:

    标签: angular validation angular-validation


    【解决方案1】:

    SplitterAlex's solution 对我不起作用,直到我将错误对象的值从 '' 更改为 true

    this.longitude = new FormControl('', [
        this.regexValidator(new RegExp('^[0-9]+$'), {'number': true}),
        this.regexValidator(new RegExp('^.{5,}$'), {'precision': true})
      ]);
    

    【讨论】:

      【解决方案2】:

      很遗憾,无法为验证器提供自定义标识符。

      更新 17.02.2018 21:00

      正如 Dawid Zbinski 在 cmets 中提到的相同错误(例如:'pattern')的多个错误被覆盖,我更新了我的答案。

      创建一个自定义验证器,该验证器通过正则表达式和一个预定义的错误作为参数:

        regexValidator(regex: RegExp, error: ValidationErrors): ValidatorFn {
          return (control: AbstractControl): {[key: string]: any} => {
            if (!control.value) {
              return null;
            }
            const valid = regex.test(control.value);
            return valid ? null : error;
          };
        }

      并像这样使用它:

        this.longitude = new FormControl('', [
          this.regexValidator(new RegExp('^[0-9]+$'), {'number': ''}),
          this.regexValidator(new RegExp('^.{5,}$'), {'precision': ''})
        ]);
        <mat-form-field class="form-field">
          <input matInput placeholder="Logitude" [formControl]="longitude">
          <mat-error *ngIf="longitude.hasError('number')">
              Longitude must be <strong>a number</strong>
          </mat-error>
          <!-- I want to be able to check patter2 for example -->
          <mat-error *ngIf="longitude.hasError('precision')">
              Longitude must have <strong>a minimum of 5 decimal numbers</strong>
          </mat-error>
      </mat-form-field>

      我还更新了 stackblitz 演示: https://stackblitz.com/edit/angular-dvwcj3?file=app%2Fhello.component.ts

      旧答案:

      PatternValidators 正在返回唯一的ValidatonErrorObjects

      当您从 official angular repo 的模式验证器中查看源代码时,您会看到它们总是在错误对象中返回正则表达式。

      return (control: AbstractControl): ValidationErrors | null => {
        if (isEmptyInputValue(control.value)) {
          return null;  // don't validate empty values to allow optional controls
        }
        const value: string = control.value;
        return regex.test(value) ? null :
                                   {'pattern': {'requiredPattern': regexStr, 'actualValue': value}};
      };
      

      考虑到这一点,您可以轻松地在 component.ts 文件中创建两个 getter 方法。并且它们在两个正则表达式之间有所不同。在这个例子中,他们只是检查一个唯一的子字符串是否与正则表达式匹配。当然,它们是处理此问题的其他方法。

        get numberError() {
          if (this.longitude && this.longitude.hasError('pattern')) {
            return this.longitude.getError('pattern').requiredPattern.indexOf('(\d+)') !== -1
          }
          return false;
        }
      
        get preciseError() {
          if (this.longitude && this.longitude.hasError('pattern')) {
            return this.longitude.getError('pattern').requiredPattern.indexOf('(\-{0,1})') !== -1
          }
          return false;
        }

      【讨论】:

      • 看起来它不起作用。似乎当您声明了多个模式时,最后一个模式将覆盖其他模式。我试图通过控制台记录getError('pattern'),但我发现它仍然是一样的,这就是为什么我认为它可能是它。
      • 但是非常感谢您抽出宝贵的时间来做这个。我真的很感激。
      • 据我所知,有可能制作自己的验证器,因此您可以区分它们。
      • 注意,错误对象中的空字符串应该为空this.regexValidator(new RegExp('^.{5,}$'), {'precision': ''})this.regexValidator(new RegExp('^.{5,}$'), {'precision': null})
      猜你喜欢
      • 1970-01-01
      • 2017-08-07
      • 2013-02-05
      • 2011-03-04
      • 2020-02-25
      • 1970-01-01
      • 2020-12-25
      • 2017-05-16
      相关资源
      最近更新 更多