Я создал специальный валидатор Async, который использует сервис для проверки электронной почты на сервере.Однако это означает, что сервер поражен каждый раз, когда вводится символ, что не годится.Здесь я проследил несколько ответов, которые мне не удалось получить.
Мой валидатор:
import {FormControl, NG_ASYNC_VALIDATORS, Validator} from
'@angular/forms';
import { Http } from '@angular/http';
import {Directive, forwardRef} from "@angular/core";
import {ValidateEmailService} from "../services/validate-email.service";
import {UserService} from "../services/user.service";
@Directive({
selector: '[appEmailValidator]',
providers: [
{ provide: NG_ASYNC_VALIDATORS, useExisting: forwardRef(() => EmailValidator), multi: true }
]
})
export class EmailValidator implements Validator {
public validateEmailService: ValidateEmailService;
constructor(
private _http: Http,
private _userService: UserService
) {
this.validateEmailService = new ValidateEmailService(this._http, this._userService);
}
validate(c: FormControl) {
return new Promise(resolve => {
this.validateEmailService.validateEmail(c.value)
.subscribe((res) => {
console.log(res);
if (res.valid) {
resolve(null);
} else {
resolve({
valid: {
valid: false
}
});
}
});
})
}
}
Сам по себе работает хорошо, но как только я пытаюсь добавитькакая-то форма отклика на него, в итоге я нарушаю его.
Я пробовал ответить на этот вопрос , и я получаю ошибки по типу Type X is not assignable to type 'Observable<any>'
и т. д.
Я подошел ближе, используя setTimeout
, но все, что в итоге закончилось, - остановка функциональности.
Моя конечная цель - запускать валидатор только тогда, когда ввод не изменялся в течение примерно 600 мс, но согласился бы только на проверку каждые 600-2000 мс.
Для дополнительной ясности, метод validateEmail
из ValidateEmailService
:
public validateEmail(email: string) {
let validateEmail = new ValidateEmail(email);
return this._http.get(
this.getUrl(validateEmail),
this.getOptionArgs())
.map((response: Response) => Object.assign(new UserEmailVerification(), response.json().UserEmailVerification));
}