簡體   English   中英

FormBuilder - 自定義驗證器 - 許多字段和承諾

[英]FormBuilder - Custom Validator - Many fields and promise

我想使用自定義驗證器來驗證我的表單,該驗證器使用許多字段,並在我的驗證函數中使用 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 無限循環的調用......

您正在自定義驗證器中使用updateValueAndValidty ,它會重新計算值和驗證狀態。 因此,當您調用它時,您的自定義驗證器正在重新啟動,從而導致無限循環。 我認為您根本不需要這個,但是如果您正在使用它,請執行...

updateValueAndValidity({emitEvent: false})

這意味着該函數不會發出事件,並且您的自定義驗證器在調用它后不會重新觸發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM