Поиск по сайту
Ctrl + K
Вопросы по Angular

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

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

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

  • Синхронные валидаторы
  • Асинхронные валидаторы
  • 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 правильно выбрать валидатор, важно учитывать контекст, в котором он будет использоваться, и правила валидации, которые применяются к вашим данным.