Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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
Typescript 如何在Angular2/4/5中实现自定义异步验证器_Typescript_Angular - Fatal编程技术网

Typescript 如何在Angular2/4/5中实现自定义异步验证器

Typescript 如何在Angular2/4/5中实现自定义异步验证器,typescript,angular,Typescript,Angular,1.它甚至还得到了Angular的支持吗?见公开发行 2.如果是,那么下面的代码有什么问题 export class someClass{ myForm:ControlGroup; constructor(public http:Http, public formBuilder:FormBuilder) this.myForm = formBuilder.group({ ImageId: ["", Validators.required,

1.它甚至还得到了Angular的支持吗?见公开发行

2.如果是,那么下面的代码有什么问题

export class someClass{

    myForm:ControlGroup;

    constructor(public http:Http, public formBuilder:FormBuilder)
       this.myForm = formBuilder.group({
            ImageId: ["", Validators.required, this.asynValidator]
    });

    asyncValidator(control: Control): {[key: string]: any} {

        return new Promise (resolve => {

          let headers = new Headers();
          headers.append('Content-Type', 'application/json');

          this.http.get('http://localhost/ImageIdValidate?id='+ control.value, {headers:headers})
                .map(res => res.json())
                .subscribe(data => {
                    console.log(data);
                    if(data != null) {
                        resolve({"duplicate": true})
                    }
                    else resolve(null);      
                })
            });
        });
      }
    }

它甚至不发出服务器请求。

您需要在组件实例本身上绑定方法,如下所述:

this.myForm = formBuilder.group({
            ImageId: ["",    
               Validators.required, 
               this.asynValidator.bind(this)]
    });
否则,您将无法使用http属性执行请求

本文还可以为您提供一些关于异步表单验证的提示(请参阅“异步验证”一节):


    • 大家好,谢谢你们的解决方案。 然而,它并没有为我工作的开箱即用

      问题是异步验证器必须是验证器的下一个参数。所以对我有效的是

      this.myForm = formBuilder.group({
              ImageId: ["",    
                 [Validators.required], 
                 [this.asynValidator.bind(this)]]
      });
      
      还有塔达!!头痛消失了。
      希望它对其他人有所帮助。

      对于Angular的较新版本,但在
      5.0.0
      之前的版本,您将添加异步验证程序作为formcontrol的第三个参数:

      myControl: ['', [Validators.required], [this.asyncValidator.bind(this)]]
      
      由于版本
      5.0.0
      ,您现在可以这样标记验证器:

      myControl: ['', {validators: [Validators.required], 
                       asyncValidators:[this.asyncValidator.bind(this)]}]
      

      事实上,这就是JavaScript的工作方式。引用方法时,会丢失它所附着的对象。你可以用BIN方法强迫我……当我开始认为我在路上成为一个职业伙伴的时候,这样的事情让我笑了。但是,这是相关的?事实上,JavaScript的OOP不同于前面的java和C++语言。使用class关键字,您不会像使用语言那样真正定义“true”类。JavaScriptUSés基于OOP的原型。是的,你引用的问题与这个问题有关。还有@ThierryTemplier的另一个答案。我能看到的唯一区别是,你在回答帖子上增加了一些额外的[]。而且你还没有提到为什么需要额外的[]。这不是一个有用的答案需要额外的[]括号,因为异步验证器现在必须作为第三个参数列出。同步验证器列在第二个参数中,异步验证器列在第三个参数中。我刚刚实现了一个异步验证函数,还必须向组件添加
      NG\u异步验证器
      provider!(这是一种令人讨厌的魔法!!)