返回promise时自定义异步验证无效

时间:2016-11-23 05:06:33

标签: validation angular promise rxjs formbuilder

我正在调用web api来检查urlalias是否可用,为此任务我在异步验证器中使用了httpservice。 问题是,当调用验证器时,将执行所有正确的代码路径(所有console.log()运行并按预期运行)。

验证中的promise是否返回/解析为null或{ 'isUrlAliasActivityMainAvailable': true },控制器总是显示一个错误对象,因此将表单状态保持为无效,为什么(血腥地狱!)?

我正在使用:angular:2.1.0和rxjs:5.0.0-beta.12

enter image description here

这是我的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;
        }
    }

1 个答案:

答案 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)],
});