【问题标题】:Angular form display one error message at a timeAngular 表单一次显示一条错误消息
【发布时间】:2019-06-23 05:42:39
【问题描述】:

我使用的是 Angular 6,我有一个表单,里面有两个字段名称和显示名称。我在必填、模式、最小长度、最大长度等两个字段上都进行了 3-4 次验证。我想一次只显示一条错误消息。如何实现?

这里是示例代码。

<mat-form-field required>
            <label for="attribute_name">Name</label>
            <input type="text"
                   required
                   matInput
                   [(ngModel)]="attribute.name"
                   name="name"
                   id="attribute_name"
                   #nameInput="ngModel"
                   [ngClass]="{'form-validation--error-border' : (nameInput?.errors && (nameInput?.dirty || nameInput?.touched)) || false}"
                   [minlength]="3"
                   [maxlength]="63"
                   [pattern]="[some pattern]" />
            <ul *ngIf="nameInput.errors && (nameInput.dirty || nameInput.touched)" class="form-validation form-validation--error">
                <li *ngIf="nameInput.errors.required">Name is required</li>
                <li *ngIf="nameInput.errors.minlength">Minimum length should be 3.</li>
                <li *ngIf="nameInput.errors.pattern">It should start with letter.</li>
            </ul>
        </mat-form-field>

【问题讨论】:

标签: angular validation angular-forms


【解决方案1】:

你可以试试 ngTemplate *ngIf, else

<ul *ngIf="nameInput.errors && (nameInput.dirty || nameInput.touched)" class="form-validation form-validation--error">
   <li *ngIf="nameInput.errors.required; else minLengthElem;">Name is required</li>
</ul>
   <ngTemplate #minLengthElem>   
    <li *ngIf="nameInput.errors.minlength; else patternElem;">Minimum length should be 3.</li>
  </ngTemplate>
  <ngTemplate #patternElem>
    <li *ngIf="nameInput.errors.pattern">It should start with letter.</li>
  </ngTemplate>

【讨论】:

  • 我使用了这种方法。谢谢
【解决方案2】:

而不是使用

来检查错误
nameInput.errors.minlength

你应该像这样使用hasError -

nameInput.hasError('min')

【讨论】:

  • 它有错误,这就是它显示 3 条错误消息的原因,但我只想显示一条优先级更高的错误消息。
【解决方案3】:

试试这样:

模板:

<ul *ngIf="nameInput.errors && (nameInput.dirty || nameInput.touched)" class="form-validation form-validation--error">
  <li [innerHtml]="getErrorMessage(nameInput.errors)"></li>
</ul>

TS:

 getErrorMessage(errors: any) {
    if (errors.required) {
      return "Name is required"
    } else if (errors.minlength) {
      return "Minimum length should be 3"
    } else if (errors.pattern) {
      return "It should start with letter"
    }
  }

【讨论】:

  • 直接从模板端调用方法是不是一个好办法?它总是会一次又一次地调用来检查更新,我猜这最终会导致性能问题。
  • 从模板或 TS 中评估某些东西是相同的,没有性能问题,即使您在模板中编写相同的东西,保存逻辑也会被计算,在其中写入 TS 只是让它变得更简单
  • 为什么是*ngIf="required"?为什么使用 innerHTML 而不是简单安全的插值?
  • @JBNizet *ngIf="required" 是个错误。
  • @AdritaSharma 不,我猜有区别,尝试在模板中的属性绑定中添加简单的方法,其中包含一些控制台,并在按钮单击时执行相同的操作,您会看到区别。跨度>
猜你喜欢
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 2018-07-01
  • 1970-01-01
相关资源
最近更新 更多