#angular #angular6 #angular-forms
#angular #angular6 #angular-формы
Вопрос:
Я пытаюсь проверить доступность имени пользователя при вводе имени пользователя с помощью rest api. Я использую угловые формы для валидаторов. Из бэкэнда я получаю true, если имя пользователя существует, и false, если нет. Я использую приведенный ниже код :
this.registerForm = this.formBuilder.group({
userName: ['', [Validators.required, this.userNameValidator.bind(this)]],
});
userNameValidator(control: AbstractControl) {
setTimeout(() => {
return this.adminService.checkUserName(control.value).subscribe((Response:any)=>{
return Response._body ? true : {'invalidUserName': true};
})
}, 1000);}
Он показывает значение null в свойстве ошибок элемента управления формой
Ответ №1:
В вашем коде есть несколько ошибок.
- На самом деле вы никогда ничего не возвращаете из
userNameValidator
метода, вы должны возвращать наблюдаемое (или обещание). - Вы не должны использовать
setTimeOut
, вместо этого используйтеtimer
из библиотеки RxJS, поскольку это возвращает наблюдаемое. - Используйте switchMap для результата таймера, чтобы вернуть наблюдаемое из вашего асинхронного вызова
- Вы должны возвращать результат, используя
map
, а не подписываться, проверка элементов управления будет подписываться на возвращаемый наблюдаемый. - Если проверка прошла успешно, вы должны вернуть
null
import { ValidationErrors } from '@angular/forms';
import { Observable, timer } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
userNameValidator(control: AbstractControl): Observable<ValidationErrors | null> {
return timer(1000).pipe(switchMap(() => {
return this.adminService.checkUserName(control.value).pipe(map((Response:any)=>{
return Response._body ? null : {'invalidUserName': true};
}));
}));
}