Angular 正在自定义验证程序中等待http请求
我为我的模板驱动表单制作了一个自定义验证器,以检查数据库中是否已经存在用户名,但由于http请求是异步的,所以我的函数总是返回null 是否有一种方法可以等待getUser()函数结束并在返回它之前将isValid字段设置为falseAngular 正在自定义验证程序中等待http请求,angular,http,Angular,Http,我为我的模板驱动表单制作了一个自定义验证器,以检查数据库中是否已经存在用户名,但由于http请求是异步的,所以我的函数总是返回null 是否有一种方法可以等待getUser()函数结束并在返回它之前将isValid字段设置为false function validateUSERNAMEFactory(userService: UserService) : ValidatorFn { return (c: AbstractControl) => { var user
function validateUSERNAMEFactory(userService: UserService) : ValidatorFn {
return (c: AbstractControl) => {
var user:User[];
var isValid = true;
userService.getUsers().subscribe((data: User[])=>{
user = data;
for(let u of user){
if(u.korIme===c.value) isValid = false;
}
});
if(isValid) {
return null;
} else {
return {
korIme: {
valid: false
}
};
}
}
}
来自服务类的代码:
getUsers(){
return this.http.get(`${this.url}/home`);
}
我的指令类:
export class USERNAMEValidator implements Validator {
validator: ValidatorFn;
constructor(private userService: UserService) {
this.validator = validateUSERNAMEFactory(this.userService);
}
validate(c: FormControl) {
return this.validator(c);
}
}
请考虑。该代码当前返回值,而不等待服务调用的响应。您应该将您的条件设置为在订阅范围内。正如@R.Richards提到的,异步验证器是这个场景的标准。如果您不熟悉如何将自定义异步确认器链接到表单控件,这里有另一个链接。该代码当前返回一个值,而不等待服务调用的响应。您应该将您的条件设置为在订阅范围内。正如@R.Richards提到的,异步验证器是这个场景的标准。如果您不熟悉如何将自定义异步验证器链接到表单控件,那么这里有另一个链接