Мой асинхронный валидатор не работает, когда я действительно выполняю асинхронный вызов (но работает, когда я имитирую его с помощью Observable.of(result)
. html
выглядит так:
<div class="form-group">
<label for="emailAddress" class="control-label">Email</label>
<input type="email"
id="emailAddress"
class="form-control"
[(ngModel)]="parent.EmailAddress"
name="emailAddress"
[ngModelOptions]="{updateOn: 'blur'}"
appDuplicateEmailValidator
#emailAddress = "ngModel">
</div>
Речь идет о валидаторе appDuplicateEmailValidator
.
Код проверки выглядит так:
public validate(control: AbstractControl): Observable<ValidationErrors | null> {
// return observableOf({ 'isDuplicateEmail': true });
return this.checkForDupeUserAndGetValidationState(emailAddress);
}
private checkForDupeUserAndGetValidationState(emailAddress): Observable<ValidationErrors | null> {
const validationStateObs: Observable<ValidationErrors | null> = new Observable(observer => {
this.adminService.getUser(emailAddress).subscribe(
(res: any) => {
const validationState = !!res ? observableOf({ 'isDuplicateEmail': true }) : null;
console.log('Observer next, validation state: ', validationState); // Gets correct val state
observer.next(validationState);
console.log('Is it hitting this'); // Gets hit
}, (err) => {
observer.next(null);
});
});
Важное замечание: когда я раскомментирую // return observableOf({ 'isDuplicateEmail': true });
, все работает, как ожидалось. Но как вы видите код выше, он не работает, даже если наблюдаемый возвращает правильное значение (зарегистрировал его как использованный отладчик). Под «не работает» я имею в виду, что элемент управления формы никогда не переходит в состояние ошибки, как показано:
<pre>IS INVALID: {{emailAddress.invalid}}</pre>
<pre>ERRORS: {{emailAddress.errors | json}}</pre>
Почему и как мне это исправить?