web-dev-qa-db-fra.com

Angular 6, cela.FormGroup.updateValueAndValidité () ne fonctionne pas correctement

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.

8
Ashutosh Singh

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);
0
Leogout