Вот пример для вас
Простой компонент инициализирует нашу реактивную форму и определяет наш асинхронный валидатор: validateEmailNotTaken.Обратите внимание, как элементы управления формы в нашем объявлении FormBuilder.group могут принимать асинхронные валидаторы в качестве третьего аргумента.Здесь мы используем только один асинхронный валидатор, но вы хотите обернуть несколько асинхронных валидаторов в массив:
app.component.ts
import { Component, OnInit } from '@angular/core';
import {
FormBuilder,
FormGroup,
Validators,
AbstractControl
} from '@angular/forms';
import { SignupService } from './signup.service';
@Component({ ... })
export class AppComponent implements OnInit {
myForm: FormGroup;
constructor(
private fb: FormBuilder,
private signupService: SignupService
) {}
ngOnInit() {
this.myForm = this.fb.group({
name: ['', Validators.required],
email: [
'',
[Validators.required, Validators.email],
this.validateEmailNotTaken.bind(this)
]
});
}
validateEmailNotTaken(control: AbstractControl) {
return this.signupService.checkEmailNotTaken(control.value).map(res => {
return res ? null : { emailTaken: true };
});
}
}
Наш валидатор очень похож на обычный пользовательский валидатор.Здесь мы определили наш валидатор в классе компонентов напрямую, а не в отдельном файле.Это облегчает доступ к нашему внедренному экземпляру службы.Обратите также внимание на то, как нам нужно связать значение this, чтобы убедиться, что оно указывает на класс компонента.
Мы также можем определить наш асинхронный валидатор в своем собственном файле, чтобы упростить повторное использование и разделение задач.Единственная сложность - найти способ предоставить экземпляр нашего сервиса.Здесь, например, мы создаем класс, который имеет статический метод createValidator, который принимает наш экземпляр службы и возвращает нашу функцию проверки:
async-email.validator.ts
import { AbstractControl } from '@angular/forms';
import { SignupService } from '../signup.service';
export class ValidateEmailNotTaken {
static createValidator(signupService: SignupService) {
return (control: AbstractControl) => {
return signupService.checkEmailNotTaken(control.value).map(res => {
return res ? null : { emailTaken: true };
});
};
}
}
Затем, возвращаясь в наш компонент, мы импортируем наш класс ValidateEmailNotTaken и вместо этого можем использовать наш валидатор:
ngOnInit() {
this.myForm = this.fb.group({
name: ['', Validators.required],
email: [
'',
[Validators.required, Validators.email],
ValidateEmailNotTaken.createValidator(this.signupService)
]
});
}
HTML-файл
<form [formGroup]="myForm">
<input type="text" formControlName="name">
<input type="email" formControlName="email">
<div *ngIf="myForm.get('email').status === 'PENDING'">
Checking...
</div>
<div *ngIf="myForm.get('email').status === 'VALID'">
? Email is available!
</div>
<div *ngIf="myForm.get('email').errors && myForm.get('email').errors.emailTaken">
this email is already taken!
</div>
</form>