Как создать пользовательский валидатор, который отображает собственное сообщение об ошибке?

У меня есть интерфейс Angular, который использует настраиваемый валидатор, чтобы обеспечить, чтобы компонент в p-диалоге имел значение от 0 до 10.

Валидатор работает просто отлично, поскольку он не позволяет пользователю отправить форму, если поле содержит значение, которое не находится между 0 и 10. Если пользователь вводит значение, например, 11, поле становится красным, а кнопка отправки выключен.

Однако я также хотел бы показать пользователю сообщение о том, почему он не может отправить. Что-то вроде "Вы должны ввести значение от 0 до 10"

Это HTML-код:

      <p-dialog header="My Dialog">
  <form [formGroup]="createForm">
    <ng-container>
  
      <input
        id="age"
        pInputText
        maxlength="30"
        formControlName="age"
        [style]="{width: '25vw'}">

    </ng-container>
  </form>
</p-dialog>

Это моя функция ngOnInit:

      ngOnInit() {
    super.ngOnInit();
    this.createForm = this.fb.group({
      'age' : new FormControl(null, [this.ageRangeValidator])
    });
}

И это моя функция проверки:

      ageRangeValidator(control: AbstractControl): { [key: string]: boolean } | null {

    if (control.value !== undefined && (isNaN(control.value) || control.value < 0 || control.value > 10)) {
        return { 'ageRange': true };
    }
    return null;
}

1 ответ

Упрощенный способ будет выглядеть примерно так:

      <p-dialog header="My Dialog">
  <form [formGroup]="createForm">
    <ng-container>
  
      <input
        id="age"
        pInputText
        maxlength="30"
        formControlName="age"
        [style]="{width: '25vw'}">
      <span *ngIf="age.errors?.ageRange">Age Range Specific Error Message</span>
    </ng-container>
  </form>
</p-dialog>

После запуска проверки возраст FormControl должен затем установить ValiationErrors в свойство errors .

Иногда это приводит к вопросу, как мне не показывать это сообщение об ошибке, пока пользователь не попытается изменить его значение:

            <span *ngIf="age.dirty && age.errors?.ageRange">Your Error Message</span>

(это предполагает, что вы выставляете элемент управления непосредственно на свой компонент:)

      public age: FormControl;
ngOnInit() {
    super.ngOnInit();
    this.age = new FormControl(null, [this.ageRangeValidator]); 
    this.createForm = this.fb.group({
      'age' : this.age,
    });
}
Другие вопросы по тегам