【问题标题】:How to display different error messages based on user input in Angular 6如何在 Angular 6 中根据用户输入显示不同的错误消息
【发布时间】:2018-09-19 05:34:27
【问题描述】:

我是 Angular 6 的新手,在这里我想验证一个用户输入字段并根据给定的输入显示不同的错误消息。

在我的项目中,我使用 Angular Material 设计 UI。

我想做的是

  • 如果用户单击保存按钮,则会显示错误消息“请输入您的 FName”。
  • 如果用户触摸但未输入任何内容并单击保存按钮,则会显示错误消息 “请输入您的 FName”。
  • 如果用户开始输入 char,则应显示错误消息 “需要最少 4 个字符”
  • 一旦用户达到 15 个字符,它应该会显示一条错误消息“仅限最多 20 个字符”
  • 如果用户输入任何特殊字符和空格以及其他输入错误消息,如“仅输入字母”

现在当输入不符合成功验证时它会变为红色。但我想在 formControl 中为每个验证显示一条错误消息。

这里我有一个垫输入字段。

<form [formGroup]="userAddressValidations" novalidate>
    <mat-form-field appearance="outline" class="col-sm-6">
        <mat-label>First Name</mat-label>
        <input matInput formControlName="firstName">
    </mat-form-field>
</form>

<button mat-raised-button class="continueBtnHeight" color="warn">
<span>Save</span>
</button>

Ts 文件

export class ButtonToggleOverviewExample {
  userAddressValidations: FormGroup;
  constructor(private formBuilder: FormBuilder) { }
  ngOnInit() {
    this.userAddressValidations = this.formBuilder.group({
      firstName: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(20), Validators.pattern('[a-zA-Z]+')]]
    });

  }
}

stackblitz:https://stackblitz.com/edit/angular-t1k1x6-skowwq?file=app%2Fbutton-toggle-overview-example.ts

谁能帮我解决这个问题。

【问题讨论】:

  • 使用mat-error

标签: angular typescript angular-material angular6


【解决方案1】:

试试这个:

<form class="example-form" [formGroup]="userAddressValidations">
  <mat-form-field class="example-full-width">
    <input matInput placeholder="First Name" formControlName="firstName">
    <mat-error *ngIf="userAddressValidations.get('firstName').hasError('required')">
      First Name is Required!
    </mat-error>
    <mat-error *ngIf="userAddressValidations.get('firstName').hasError('minlength')">
      First Name should be atleast 4 characters long!
    </mat-error>

    <mat-error *ngIf="userAddressValidations.get('firstName').hasError('maxlength')">
      First Name can be atmax n characters long!
    </mat-error>

    <mat-error *ngIf="userAddressValidations.get('firstName').hasError('pattern')">
      First Name must follow this pattern!
    </mat-error>
  </mat-form-field>

</form>

这里有一个Sample StackBlitz 供您参考。

【讨论】:

  • 它只显示 FirstName 是需要验证的。其他消息不起作用。 @SiddAjmera
  • 更新了答案。错误名称的情况存在问题。 minLength 应该是 minlength
  • 这里如果用户以特殊字符开头,错误消息应该是“名字必须遵循这个模式!”而不是最小字符错误。如果我是对的怎么做兄弟@SiddAjmera
  • 您可能想要更改错误消息的顺序。我认为有一个优先顺序。不过我不确定。
  • 希德,是对的。 @朱。只需更改您的 ts 的顺序。文件
【解决方案2】:

如果用户输入任何特殊字符和空格,请使用hasError('invalidName')

Stackblitz

组件.html

<form [formGroup]="userAddressValidations">

    <label>User Name : 
        <input type="text"  formControlName="firstName">
    </label><br>

    <div class="errors" *ngIf="userAddressValidations.get('firstName').invalid && (userAddressValidations.get('firstName').touched || userAddressValidations.get('firstName').dirty)">

        <div *ngIf="userAddressValidations.get('firstName').hasError('required')">
            Please enter your FName
        </div>

        <div *ngIf="userAddressValidations.get('firstName').errors.minlength">
            minimum 4 char required
        </div>

        <div *ngIf="userAddressValidations.get('firstName').errors.maxlength">
            Maximum 20 char only
        </div>

        <div class="error-text" *ngIf="userAddressValidations.get('firstName').hasError('invalidName')">
            Enter only alphabets
        </div>
    </div>

</form>

组件.ts

this.userAddressValidations = fb.group({
      firstName: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(20), usernameValidator]]
});

用户名.validators.ts

import { AbstractControl, ValidationErrors } from "@angular/forms"

export const usernameValidator = function (control: AbstractControl): ValidationErrors | null {

  let value: string = control.value || '';

  if (value) {
    const matches = value.match(/^[a-zA-Z]+$/);
    return matches ? null : { 'invalidName': true };
  } else {
    return null;
  }
}

【讨论】:

  • 这里如果用户以特殊字符开头,错误消息应该是“名字必须遵循这个模式!”而不是最小字符错误。如果我是对的怎么做兄弟@Krishna Rathore
  • 添加这个条件
    最少4需要字符
【解决方案3】:

看看这个教程https://codecraft.tv/courses/angular/forms/model-driven-validation,你也可以参考这个stackoverflow问题:Display custom validator error with mat-error

但这里有一个小例子:

<form [formGroup]="userAddressValidations" novalidate>
    <mat-form-field appearance="outline" class="col-sm-6">
        <mat-label>First Name</mat-label>
        <input matInput formControlName="firstName">
         <mat-error *ngIf="email.errors.required">{{getErrorMessage()}}</mat-error>
         <mat-error *ngIf="email.errors.minlength">{{getErrorMessage()}}</mat-error>
    </mat-form-field>
</form>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2017-10-11
    相关资源
    最近更新 更多