我正在调用web api来检查urlalias是否可用,为此任务我在异步验证器中使用了httpservice。
问题是,当调用验证器时,将执行所有正确的代码路径(所有console.log()
运行并按预期运行)。
验证中的promise是否返回/解析为null或{ 'isUrlAliasActivityMainAvailable': true }
,控制器总是显示一个错误对象,因此将表单状态保持为无效,为什么(血腥地狱!)?
我正在使用:angular:2.1.0和rxjs:5.0.0-beta.12
这是我的formbuilder:
this.formBuilder.group({
//...
"urlAliasActivityMain":[null,[ ValidatorsZr.isUrlAliasActivityMainAvailableAsyncValidator(this.httpActivityService)]],
});
这是我的验证员:
public static isUrlAliasActivityMainAvailableAsyncValidator(httpActivityService: HttpActivityService) {
return function (control: FormControl): Promise<any> | Observable<any> {
const promise = new Promise<any>(
(resolve, reject) => {
httpActivityService.isUrlAliasActivityMainAvailable(control.value)
.subscribe(
(data: any) => {
console.log("isUrlAliasActivityMainAvailableAsyncValidator");
console.log(data);
if (data == false) {
console.log("data == false");
resolve({ 'isUrlAliasActivityMainAvailable': true });
}
else {
console.log("data == true");
resolve(null);
}
},
)
});
return promise;
}
}
答案 0 :(得分:14)
您的异步验证程序列在数组中的同步验证程序位置,但未正确评估。
[objectValue, synchronous validators, asynchronous validators]
control(formState:Object,validator?:ValidatorFn | ValidatorFn [], asyncValidator?:AsyncValidatorFn | AsyncValidatorFn []):FormControl 使用给定的formState,validator和构造一个新的FormControl asyncValidator。
formState可以是表单控件的独立值,也可以是 包含值和禁用状态的对象。
要更正它,请将验证器移动到相应的阵列位置:
this.formBuilder.group({
//...
"urlAliasActivityMain":[null, null, ValidatorsZr.isUrlAliasActivityMainAvailableAsyncValidator(this.httpActivityService)],
});