Как отображать различные сообщения об ошибках на основе пользовательского ввода в Angular 6

Я новичок в angular 6, здесь я хочу проверить поле ввода пользователя и отобразить различные сообщения об ошибках на основе заданного ввода.

В своем проекте я использую дизайн Angular Material для пользовательского интерфейса.

Что я хочу сделать, это

  • Если пользователь нажимает кнопку сохранения, отображается сообщение об ошибке как «Пожалуйста, введите ваше имя FName».
  • Если пользователь коснулся, но ничего не ввел и нажал кнопку сохранения, отобразится сообщение об ошибке как «Пожалуйста, введите ваше имя FName».
  • Если пользователь начал вводить символ, он должен показать сообщение об ошибке как "требуется минимум 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

Antoniossss 19.09.2018 07:39
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
4
1
13 778
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Взгляните на этот учебник https://codecraft.tv/courses/angular/forms/model-driven-validation, вы также можете сослаться на этот вопрос о переполнении стека: Отображать ошибку настраиваемого валидатора с ошибкой mat

Но вот небольшой пример:

<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>
Ответ принят как подходящий

Попробуй это:

<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>

Вот Образец StackBlitz для вашего исх.

Он показывает, что требуется только проверка FirstName. другие сообщения не работают. @SiddAjmera

Zhu 19.09.2018 07:48

Обновил ответ. Возникла проблема с именами ошибок. minLength должен был быть minlength

SiddAjmera 19.09.2018 07:50

Здесь, если пользователь начинает со специального символа, сообщение об ошибке должно быть таким, как "Имя должно следовать этому шаблону!" вместо минимальной ошибки символа. Если я прав, как это сделать, брат @SiddAjmera

Zhu 19.09.2018 07:55

Возможно, вы захотите изменить последовательность сообщений об ошибках. Я думаю, есть приоритетная последовательность. Хотя я не уверен.

SiddAjmera 19.09.2018 07:56

Сидд, прав. @Zhu. Просто измените порядок вашего ts. файл

devpato 19.09.2018 07:58

не могли бы вы помочь мне решить эту stackoverflow.com/questions/52417652/… @SiddAjmera

Zhu 20.09.2018 07:05

используйте hasError('invalidName'), если пользователь вводит какой-либо специальный символ и пробел

Stackblitz

Component.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>

Component.ts

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

username.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

Zhu 19.09.2018 07:58

добавьте это условие <div * ngIf = "! userAddressValidations.get ('firstName'). hasError ('in‌ validName') && userAddressValidations.get ('firstName'). errors.minlength"> требуется минимум 4 символа </div>

Krishna Rathore 19.09.2018 08:01

Другие вопросы по теме