Проверка электронной почты с помощью чипов углового материала

Я пытаюсь создать форму с вводом, используя чипы для отправки сообщения на различные электронные письма. У меня он почти функционален, но я не знаю, как правильно показывать ошибку сообщения, когда вы пишете неверный адрес электронной почты или ничего не пишете.

Это мой собственный валидатор

import { FormControl } from '@angular/forms';

const REGEXP_EMAIL =
  /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@(([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{2,})$/i;

export const emailsArrayValidator = (control: FormControl) => {
  const emails: string[] = Array.isArray(control.value) ? control.value : [];
  const invalidEmails = emails.filter(email => !REGEXP_EMAIL.test(email.trim()));
  return invalidEmails.length === 0 ? null : { invalidEmails: true };
};

Это компонент.ts

  constructor(private fb: FormBuilder) {
    this.inviteForm = this.fb.group({
      name: ['', Validators.required],
      email: ['', [Validators.required, Validators.pattern(this.REGEXP_EMAIL)]],
      date: ['', Validators.required],
      friends: [[], [Validators.required, Validators.minLength(1), emailsArrayValidator]],
    });
  }

  get name() {
    return this.inviteForm.get('name') as FormControl;
  }

  get email() {
    return this.inviteForm.get('email') as FormControl;
  }

  get date() {
    return this.inviteForm.get('date') as FormControl;
  }

  get friends() {
    return this.inviteForm.get('friends') as FormControl;
  }

  addFriend(event: MatChipInputEvent) {
    const friendEmail = event.value.trim();

    const friends = [...this.friends.value, friendEmail];
    const validationErrors = emailsArrayValidator(new FormControl(friends));
    console.info(validationErrors);
    if (validationErrors) {
      this.friendsErrorMessage = 'The last email is not valid';
    } else {
      this.friendsErrorMessage = '';
      this.friends.setValue(friends);
    }

    event.chipInput!.clear();
  }

  removeFriend(email: string) {
    const friends = this.friends.value.slice();
    const index = friends.indexOf(email);
    if (index !== -1) {
      friends.splice(index, 1);
      this.friends.setValue(friends);
    }
  }

и это html

      <mat-form-field>
        <mat-label>Enter invitation email</mat-label>
        <mat-chip-grid #chipGrid>
          @for (friend of friends.value; track friend) {
          <mat-chip-row (removed) = "removeFriend(friend)" [editable] = "true">
            {{ friend }}
            <button matChipRemove>
              <mat-icon>cancel</mat-icon>
            </button>
          </mat-chip-row>
          }
          <input
            [matChipInputFor] = "chipGrid"
            [matChipInputSeparatorKeyCodes] = "separatorKeysCodes"
            [matChipInputAddOnBlur] = "addOnBlur"
            (matChipInputTokenEnd) = "addFriend($event)"
            required
        /></mat-chip-grid>
        @if (friends.errors && friends.touched) {
        <mat-error>{{ friendsErrorMessage }}</mat-error>
        }
      </mat-form-field>
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема аналогична этой проблеме на GitHub: mat-ошибка с MatChipInput не отображается под вводом.

  1. Нажмите триггер errorState = true, чтобы отобразить сообщение об ошибке.
  2. Установите ошибку для friends управления через <AbstractControl>.setErrors(/* ValidationError */).
  3. Отметьте элемент управления friends как касание с помощью <AbstractControl>.markAsTouched(), чтобы отобразить сообщение об ошибке в качестве вашего состояния: @if (friends.errors && friends.touched).

Кроме того, вам также следует сбросить errorState и удалить ошибку проверки для сценария, в котором ранее был введен неверный адрес электронной почты, а затем ввести действительный адрес электронной почты.

import {MatChipGrid} from '@angular/material/chips';

@ViewChild('chipGrid') chipGrid: MatChipGrid;

addFriend(event: MatChipInputEvent) {
  const friendEmail = event.value.trim();

  const friends = [...this.friends.value, friendEmail];
  const validationErrors = emailsArrayValidator(new FormControl(friends));
  console.info(validationErrors);
  if (validationErrors) {
    this.friendsErrorMessage = 'The last email is not valid';
    this.friends.setErrors(validationErrors, { emitEvent: false })
    this.chipGrid.errorState = true;
  } else {
    this.chipGrid.errorState = false;
    this.friends.setErrors({ invalidEmails: null });

    this.friendsErrorMessage = '';
    this.friends.setValue(friends);
  }

  this.friends.markAsTouched();
  event.chipInput!.clear();
}

Демо @ StackBlitz

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