Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation 返回承诺时自定义异步验证不起作用_Validation_Angular_Promise_Rxjs_Formbuilder - Fatal编程技术网

Validation 返回承诺时自定义异步验证不起作用

Validation 返回承诺时自定义异步验证不起作用,validation,angular,promise,rxjs,formbuilder,Validation,Angular,Promise,Rxjs,Formbuilder,我调用web api来检查URL别名是否可用,对于这个任务,我在异步验证器中使用了一个httpservice。 问题是,当调用验证器时,会执行所有正确的代码路径(所有console.log()按预期运行和行为) 无论验证的承诺返回/解析为null还是{'isurlaisActivityMainAvailable':true},控制器总是显示一个错误对象,如下所示,从而使表单状态保持无效,为什么(该死!) 我使用的是:angular:2.1.0和rxjs:5.0.0-beta.12 这是我的fo

我调用web api来检查URL别名是否可用,对于这个任务,我在异步验证器中使用了一个httpservice。 问题是,当调用验证器时,会执行所有正确的代码路径(所有
console.log()
按预期运行和行为)

无论验证的承诺返回/解析为null还是
{'isurlaisActivityMainAvailable':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;
        }
    }
公共静态iUrlAliasActivityMainAvailableAsyncValidator(httpActivityService:httpActivityService){
返回函数(控制:FormControl):承诺|可观察{
const promise=新的承诺(
(解决、拒绝)=>{
httpActivityService.isUrlAliasActivityMainAvailable(control.value)
.订阅(
(数据:任何)=>{
log(“isUrlAliasActivityMainAvailableAsyncValidator”);
控制台日志(数据);
如果(数据==false){
log(“数据==false”);
解析({'isUrlAliasActivityMainAvailable':true});
}
否则{
log(“数据==true”);
解析(空);
}
},
)
});
回报承诺;
}
}

您的异步验证器列在阵列中的同步验证器位置,并且被错误地评估

[objectValue、同步验证器、异步验证器]

控件(formState:Object,validator?:ValidatorFn | ValidatorFn[], asyncValidator?:AsyncValidatorFn | AsyncValidatorFn[]):FormControl 使用给定的formState、验证器和 异步验证程序

formState可以是窗体控件的独立值,也可以是 对象,该对象同时包含值和禁用状态

要更正它,请将验证器移动到适当的阵列位置:

this.formBuilder.group({
//...
"urlAliasActivityMain":[null, null, ValidatorsZr.isUrlAliasActivityMainAvailableAsyncValidator(this.httpActivityService)],
});

天哪,真为我感到羞耻!谢谢你的帮助,你节省了很多时间!因为这件事,我浪费了大约4个小时。这拯救了未来,哈哈,我和它斗争了一天,不知道它是我放置它的位置