J'essaie d'ajouter et de supprimer des validateurs dans des contrôles formGroup
basés sur certaines conditions.
Lorsque je mette à jour les validateurs via formGroup.updateValueAndValidity()
pour le formulaire entier, il ne mettant pas à jour, où, comme si je demande spécifiquement à chaque contrôle, c'est-à-dire formGroup.get('formControl').updateValueAndValidity()
, il fonctionne mais je dois écrire pour chaque contrôle qui est que j'espère pas la bonne façon. Qu'est-ce que je fais mal?
if (data == 'x') {
this.myForm.get('control2').setValue(null);
this.myForm.get('control2').setValidators(Validators.nullValidator);
this.myForm.get('control1').setValidators(Validators.required);
} else if (data == 'y') {
this.myForm.get('control1').setValue(null);
this.myForm.get('control1').setValidators(Validators.nullValidator);
this.myForm.get('control2').setValidators(Validators.required);
}
this.myForm.get('control1').updateValueAndValidity();
this.myForm.get('control2').updateValueAndValidity();
cela fonctionne, mais,
this.myForm.updateValueAndValidity();
cela ne fonctionne pas.
DISCLAIMER : Cela peut être une mauvaise pratique, mais cela fait quoi Angular ne me permet pas de faire simplement. Soyez prévenu que cela est hautement inefficace par rapport à la voie de la validation de l'angulaire. Voici comment rafraîchir la validation de la forme complète:
validateForm(control: AbstractControl) {
control['controls'].forEach(
// make sure to pass {onlySelf: true, emitEvent: false}
// or it will recurse indefinitely
control => control.updateValueAndValidity({onlySelf: true, emitEvent: false})
);
return null;
}
Et pour mon usecase, j'avais besoin de la mise à jour de la validité de la forme entière chaque fois que l'utilisateur change de champ (et non seulement la validation du champ actuel ou uniquement des champs touchés, Yadi Yada):
this.form.setValidators(this.validateForm);