Существует множество встроенных директив, которые применяют некоторые встроенные валидаторы :
Но вы также можете создать свою собственную настраиваемую директиву для применения правила проверки. Вам просто нужно реализовать интерфейс 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});
}
}