没有调用FormGroup asyncValidator?

时间:2018-04-05 07:51:20

标签: angular angular-validation

我一直在研究这个问题很长一段时间,我在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 };
    });
  }

UPDATE,

 <form [formGroup]="patientRestrationForm" autocomplete="off" autocomplete="nope"
    (ngSubmit)="onSubmit()">

最小刺激是here

1 个答案:

答案 0 :(得分:1)

验证者必须与某个字段相关联,您的asyncValidator并未链接到您表单中的字段,这就是为什么它从未被调用过(请参阅{{3 }})。

您的异步验证逻辑依赖于多个字段,我认为您应该在提交事件上设置此逻辑,以便确保设置所有属性(如果使用Validators.required将它们设置为必需)并且您&# 39;如果整个表格有效,我将能够提出你的请求(因为这个验证器没有链接到单个字段)。

解决方法是删除此asyncValidator并将其逻辑放入您的提交方法,如果请求未验证表单内容,则将错误标记设置为true。

旁注:return this.asyncValidator.bind(control)无法正常工作,绑定到控件会导致this成为控件,其中asyncValidationService未定义。你不应该在这里使用bind。