Как применить правило проверки с помощью директивы Реактивная форма? - PullRequest
3 голосов
/ 05 августа 2020

Я использую реактивные формы в Angular.

<input type="text" name="name" formControlName="name">

Как применить правило проверки (настраиваемое или стандартное Validators.required) для этого ввода с помощью директивы?

1 Ответ

3 голосов
/ 05 августа 2020

Существует множество встроенных директив, которые применяют некоторые встроенные валидаторы :

Но вы также можете создать свою собственную настраиваемую директиву для применения правила проверки. Вам просто нужно реализовать интерфейс Validator , например

ts

@Directive({
  selector: '[customValidator]',
  providers: [{provide: NG_VALIDATORS, useExisting: CustomValidatorDirective, multi: true}]
})
class CustomValidatorDirective implements Validator {
  validate(control: AbstractControl): ValidationErrors|null {
    return {'custom': true};
  }
}

html

<input type="text" name="name" formControlName="name" customValidator>
                                                      ^^^^^^^^^^^^^^^

Вы даже можете использовать свойство @Input для настройки logi c внутри валидатора

ts

@Directive({
  selector: '[customValidator]',
  providers: [{provide: NG_VALIDATORS, useExisting: CustomValidatorDirective, multi: true}]
})
class CustomValidatorDirective implements Validator {
  @Input() customValidator: string;

  validate(control: AbstractControl): ValidationErrors|null {
    return control.value !== this.customValidator ? {'notYurzui': true} : null;
  }
}

html

<input type="text" name="name" formControlName="name" customValidator="yurzui">
                                                      ^^^^^^^^^^^^^^^^^^^^^^^^

Если вам этого недостаточно и вы хотите выполнить асинхронную проверку, вы можете создать асинхронный c эквивалент настраиваемой директивы:

@Directive({
  selector: '[customAsyncValidator]',
  providers: [{
    provide: NG_ASYNC_VALIDATORS,
    useExisting: CustomAsyncValidatorDirective,
    multi: true
  }]
})
class CustomAsyncValidatorDirective implements AsyncValidator {
  validate(control: AbstractControl): Observable<ValidationErrors|null> {
    return of({'custom': true});
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...