【发布时间】:2019-08-18 20:10:23
【问题描述】:
我正在尝试创建一个带有异步验证的控件,但我不想要同步验证:
使用 formBuilder 创建表单。
this.myForm = this.fb.group({
someControl: new FormControl(
"",
null,
[this.valueUnique.bind(this)]
)})
如果我将同步验证参数保留为 Validators.required,则不会出现错误。
错误:
ERROR 错误:预期的验证器返回 Promise 或 Observable。 在 toObservable (forms.js:603) 在 Array.map() 在 FormControl.asyncValidator (forms.js:591) 在 FormControl.push../node_modules/@angular/forms/fesm5/forms.js.AbstractControl._runAsyncValidator (forms.js:2535) 在 FormControl.push../node_modules/@angular/forms/fesm5/forms.js.AbstractControl.updateValueAndValidity (forms.js:2508) 在 FormControl.push../node_modules/@angular/forms/fesm5/forms.js.AbstractControl._updateTreeValidity (forms.js:2523) 在 forms.js:2522 在 forms.js:3309 在 Array.forEach () 在 FormGroup.push../node_modules/@angular/forms/fesm5/forms.js.FormGroup._forEachChild (forms.js:3309)
验证器函数:
/**
* Validator to checking existance/uniqueness
* of entered value
* @param control
*/
valueIsUnique(control: AbstractControl): Promise<ValidationErrors|null> | null {
if (control && (control.value !== null && control.value !== undefined)) {
return new Promise((resolve, reject) => {
this.service.checkValueExists(control.value).subscribe(res => {
{
if (res && res['data']) {
resolve({
unique: true
});
}
else {
resolve(null);
}
}
},
err=>
{
resolve(null);
});
});
}
}
【问题讨论】:
-
您确定
this.valueUnique.bind(this)正在返回Observable或Promise?因为帽子是错误所说的,所以您对函数valueUnique的绑定没有返回这种类型。 -
@SamVloeberghs 谢谢,是的,我的异步验证器返回承诺。我已经更新了问题。昨天还添加了类似的帖子:stackoverflow.com/questions/55375700/… 如果我添加同步验证 = Validators.required 则不会出现错误。
-
你的 if 应该在 return new Promise 中。你有一个潜在的情况,你没有返回一个承诺。
-
@SamVloeberghs 好的,谢谢。让我检查一下,我会更新你。
-
@SamVloeberghs 如果条件超出新的承诺,我该如何返回承诺?
标签: angular angular-reactive-forms angular-validation angular-formbuilder