Вопросы по Angular

Какие бывают типы функций валидаторов?

В Angular валидаторы — это специальные функции, которые проверяют состояние данных во формах. Они помогают убедиться, что данные, введённые пользователями, соответствуют определённым критериям и требованиям, прежде чем эти данные будут обработаны или отправлены на сервер.

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

  1. Синхронные валидаторы
  2. Асинхронные валидаторы

1. Синхронные валидаторы

Синхронные валидаторы возвращают состояние валидности немедленно, как только форма или элемент формы изменяются. Они выполняют проверку входных значений и возвращают объект ошибки или null, если ошибки нет.

Пример синхронного валидатора

import { AbstractControl, ValidationErrors } from '@angular/forms';

export function customValidator(control: AbstractControl): ValidationErrors | null {
  const forbiddenValue = 'test';
  return control.value === forbiddenValue ? { forbiddenName: { value: control.value } } : null;
}

В этом примере валидатор проверяет, равно ли введенное значение слову "test". Если да, то он возвращает объект ошибки; если нет — null.

Чтобы использовать этот валидатор в форме, можно сделать так:

import { FormBuilder, FormGroup } from '@angular/forms';

export class ExampleComponent {
  form: FormGroup;

  constructor(private fb: FormBuilder) {
    this.form = this.fb.group({
      username: ['', [customValidator]]
    });
  }
}

2. Асинхронные валидаторы

Асинхронные валидаторы используются для выполнения проверки, которая зависит от внешнего источника, например, для проверки, занято ли имя пользователя в базе данных. Они возвращают Promise или Observable, которые будут проверены позже.

Пример асинхронного валидатора

import { AbstractControl, ValidationErrors } from '@angular/forms';
import { Observable, of } from 'rxjs';
import { map, catchError } from 'rxjs/operators';

export function asyncValidator(control: AbstractControl): Observable<ValidationErrors | null> {
  return checkName(control.value).pipe(
    map(isTaken => (isTaken ? { nameTaken: true } : null)),
    catchError(() => of(null))
  );
}

function checkName(name: string): Observable<boolean> {
  // Здесь должен быть вызов на сервер
  return of(name === 'existingUser'); // Пример логики
}

В этом примере валидатор имитирует асинхронный вызов, чтобы проверить, занято ли имя пользователя. Он возвращает true, если имя занято, и false в противном случае.

И использует валидатор в компоненте:

import { FormBuilder, FormGroup } from '@angular/forms';

export class ExampleComponent {
  form: FormGroup;

  constructor(private fb: FormBuilder) {
    this.form = this.fb.group({
      username: ['', { asyncValidators: [asyncValidator] }]
    });
  }
}

Заключение

Использование валидаторов в Angular позволяет улучшить качество данных, вводимых пользователями, и дать им понятные сообщения об ошибках. To правильно выбрать валидатор, важно учитывать контекст, в котором он будет использоваться, и правила валидации, которые применяются к вашим данным.