我想使用一个自定义验证器来验证我的表单,该验证器使用许多字段,并且在验证函数中使用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的调用无限期地循环...
答案 0 :(得分:1)
您在自定义验证器中使用updateValueAndValidty
,该验证器将重新计算值和验证状态。因此,当您调用该命令时,您的自定义验证程序将触发,从而导致无限循环。我完全看不到您需要它,但是如果您正在使用它,请...
updateValueAndValidity({emitEvent: false})
这意味着该函数不会发出事件,并且您的自定义验证器在调用后不会重新触发。