我一直在研究这个问题很长一段时间,我在SO上发现了几个问题,但没有人帮我解决这个问题。这是mine最接近的问题。我试图为formGroup调用asyncValidator,但我不能让它工作。任何帮助都会非常感激,
在下面的代码中,http请求甚至没有被触发,
这是我的formGroup
,
const partners = this.formBuilder.array([]);
this.patientRestrationForm = this.formBuilder.group(
{
patientFileId: new FormControl(null),
firstName: new FormControl(null, Validators.required),
secondName: new FormControl(null, Validators.required),
lastName: new FormControl(null, Validators.required),
aliasName: new FormControl(null),
patientDob: new FormControl(null, Validators.required),
patientEmail: new FormControl(null, [Validators.email, Validators.required]),
socialSecurityNo: new FormControl(null),
passportNo: new FormControl(null),
countryCodeId: new FormControl(null),
patientMobileNo: new FormControl(null),
partners: partners,
},
{
asyncValidator: (control: AbstractControl) => {
return this.asyncValidator.bind(control)
}
});
这是asyncValidator
asyncValidator(control: AbstractControl): Promise<any> | Observable<any> {
const patientFileId = control.get('patientFileId');
const countryCodeId = control.get('countryCodeId');
const patientMobileNo = control.get('patientMobileNo');
const patientEmail = control.get('patientEmail');
if (patientEmail.value) {
return this.asyncValidationService.validateEmailNotTaken(patientEmail, patientFileId)
}
}
和我的服务,
public validateEmailNotTaken(a: AbstractControl, b?): Observable<{ [key: string]: any }> {
console.log('called::', a.value);
return this.httpService.getRequest(
'PatientsRegistration/IsPatientEmailExist' + '?control=' + a.value + '&id=' + b.value,
).map((response: HttpResponse<boolean>) => {
return !response.body ? null : { asyncInvalid: true };
});
}
<form [formGroup]="patientRestrationForm" autocomplete="off" autocomplete="nope"
(ngSubmit)="onSubmit()">
最小刺激是here
答案 0 :(得分:1)
验证者必须与某个字段相关联,您的asyncValidator
并未链接到您表单中的字段,这就是为什么它从未被调用过(请参阅{{3 }})。
您的异步验证逻辑依赖于多个字段,我认为您应该在提交事件上设置此逻辑,以便确保设置所有属性(如果使用Validators.required
将它们设置为必需)并且您&# 39;如果整个表格有效,我将能够提出你的请求(因为这个验证器没有链接到单个字段)。
解决方法是删除此asyncValidator
并将其逻辑放入您的提交方法,如果请求未验证表单内容,则将错误标记设置为true。
旁注:return this.asyncValidator.bind(control)
无法正常工作,绑定到控件会导致this
成为控件,其中asyncValidationService
未定义。你不应该在这里使用bind。