Typescript 如何在Angular2/4/5中实现自定义异步验证器
1.它甚至还得到了Angular的支持吗?见公开发行 2.如果是,那么下面的代码有什么问题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,
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!(这是一种令人讨厌的魔法!!)