web-dev-qa-db-fra.com

Définir et mettre à jour la validation sur le tableau de formulaires dans les formulaires réactifs

Dans angular 4 je crée un formulaire qui a un tableau de formulaires comme ça

this.formBuilder.group({
  name: ['', [Validators.required, Validators.minLength(3)]],
  required:false,
  selectType: ['', [Validators.required]],
  items: this.formBuilder.array([this.buildItems()])
})

...
buildItems() {
  return this.formBuilder.group({ 
     name: ['', [Validators.required]] 
});

Cela crée le formulaire et je peux ajouter, etc., supprimer de ce formulaire et des éléments du formulaire. Ce que j'essaie maintenant de réaliser, c'est que lorsque le selectType est égal à custom (qui est défini comme une valeur de bouton radio sur le formulaire), alors je dois changer la validation des éléments name et effacez ses exigences de validation.

J'ai fait un ensemble et mis à jour sur un autre formulaire comme ça

  changeValidation() {
      if(condition){
          this.form.get('name').setValidators(Validators.required);
          this.form.get('name').updateValueAndValidity();
      }
  }

Ce qui fonctionne bien, mais je ne sais pas comment mettre à jour les validations sur le tableau de formulaires. j'ai essayé

this.items.clearValidators();
this.items.updateValueAndValidity();

Je ne reçois aucune erreur mais cela ne fonctionne pas non plus. Quel type de sens parce que je ne cible pas un FormControl spécifique, mais comment spécifier un FormControl spécifique lorsque les FormControls sont un tableau?

9
user1752532

comment spécifier un FormControl spécifique lorsque les FormControls sont un tableau?

Vous devez utiliser la méthode at décrite ici pour obtenir un seul contrôle:

this.items.at(0).clearValidators();

Si vous voulez effacer les validateurs du contrôle name, faites comme ça:

 this.items.at(0).controls.name.clearValidators();

Si vous souhaitez supprimer des validateurs pour chaque contrôle, il semble que le tableau de formulaires ne fournisse pas une telle API. Vous devez parcourir les contrôles du tableau de formulaires et supprimer les validateurs pour chaque contrôle:

this.items.controls.forEach(c => c.clearValidators());
14
Maxim Koretskyi