FormBuilder-自定义验证器-许多字段和承诺

时间:2019-01-17 17:56:42

标签: javascript angular typescript

我想使用一个自定义验证器来验证我的表单,该验证器使用许多字段,并且在验证函数中使用Promise ...

我写这段代码:

this.saisieForm = this.fb.group({
  'refUnique': ['', [Validators.required]],
  'refLettrage': ['', [Validators.required],ValidateRefLettrage(this.operationService)],
  'typeOperation': ['', [Validators.required, ValidateTypeOperation]],
  'codeProduitGestion': new FormControl(''),
  'sectionPatri': new FormControl(''),
  'compteDispo': ['', [Validators.required, ValidateCompteDispo]],
  'dateOperation': ['', [Validators.required,ValidateDate(this.envService.config.app.dateOperationMinJour,this.envService.config.app.dateOperationMaxJour)]],
  'dateValeur': ['',[Validators.required,ValidateDate(this.envService.config.app.dateValeurMinJour,this.envService.config.app.dateValeurMaxJour)]],
  'montant': ['', Validators.required],
  'commentaire': new FormControl('')
}, {
  validator: [ValidatorsSaisies.validateMontant(Validators.required, ['montant', "compteDispo"]),ValidatorsSaisies.validateDoublons2(this.operationService)]
});

以及自定义验证器:

  static validateDoublons2(operationService:OperationService) {
  return (group: FormGroup): {[key: string]: any} => {
    return new Promise(resolve => {
      setTimeout(() => {
        console.log('myAsyncValidator finished!')
        setTimeout(() => group.updateValueAndValidity())

        operationService.checkDoublons(
          group.get("refUnique").value,
          group.get("dateValeur").value,
          group.get("dateValeur").value,
          group.get("montant").value,
          group.get("montant").value,
          group.get("compteDispo").value.taParamDevise,
          group.get("refLettrage").value,
          group.get("typeOperation").value.sens,
          "200")
          .then((data) => {
            test = true;
            resolve(null);

          })
          .catch((err) => {
            resolve({validRefLettrage: true})
          });

      }, 2500);
    })


  }
}

问题是... validateDoublons2的调用无限期地循环...

1 个答案:

答案 0 :(得分:1)

您在自定义验证器中使用updateValueAndValidty,该验证器将重新计算值和验证状态。因此,当您调用该命令时,您的自定义验证程序将触发,从而导致无限循环。我完全看不到您需要它,但是如果您正在使用它,请...

updateValueAndValidity({emitEvent: false})

这意味着该函数不会发出事件,并且您的自定义验证器在调用后不会重新触发。