У меня есть работающий асинхронный валидатор, который отправляет HTTP-запрос на сервер, чтобы проверить, не занято ли уже имя пользователя.Поскольку я не хочу вызывать API после каждого нажатия клавиши, мне нужно отсеивать поток ввода.
Сначала у меня было throttleTime
в службе, но в другой теме о SO говорилось, что это должно быть на однойкто подписывается, но пока не повезло!
Мой компонент:
this.form = this._fb.group(
{
username: ['', [Validators.required, Validators.maxLength(50), NoWhitespaceValidator], [IsUserIdFreeValidator.createValidator(this._managementService)]]
});
Мой валидатор:
export class IsUserIdFreeValidator {
static createValidator(_managementService: ManagementService) {
return (control: AbstractControl) => {
return _managementService.isUserIdFree(control.value)
.pipe(
throttleTime(5000),
(map(
(result: boolean) => result === false ? { isUserIdFree: true } : null))
);
};
}
}
Мой сервис:
public isUserIdFree(userId: string): Observable<{} | boolean | HttpError> {
const updateUserCheck: UpdateUserCheck = new UpdateUserCheck();
updateUserCheck.userID = userId;
return this._httpClient.post<boolean>('UserManagementUser/IsUserIdFree', updateUserCheck));
}