web-dev-qa-db-fra.com

Comment dois-je gérer ma case à cocher dynamique avec Angular 6

J'ai un ensemble de catégories provenant d'un service Web: categories, et un tableau avec les catégories sélectionnées: selectedCategories

Pour afficher toutes les cases à cocher, je fais:

<form [formGroup]="formGroup" (ngSubmit)="onSubmit()">
  <div class="row">
    <div *ngFor="let category of categories">
      <input type="checkbox" class="custom-control-input" [id]="category.id" formControlName="category"
             [checked]="categoriesSelected?.includes(category.id)">
      <label class="custom-control-label" [for]="category.id">{{ category.name | translate }}</label>
    </div>
  </div>
</form>

cela fonctionne très bien.

Ensuite, je crée mon formGroup:

ngOnInit() {
    this.categoriesSelected = this.championships.map(championship => championship.category.id);
    this.formGroup = this.formBuilder.group({
      categories: this.formBuilder.array([{}])
    });
  }

Maintenant, la sortie dont j'ai besoin n'est que les identifiants des catégories sélectionnées.

Je suis un peu perdu à propos de la liaison du formBuilder et du formGroup.

Si j'ajoute formControlName="categories" dans mon modèle, dans la balise input, toutes les données disparaissent.

Comment dois-je procéder?

4
Juliatzin del Toro

Vous êtes proche, il vous suffit de passer categoriesSelected dans this.formBuilder.array() et de faire quelques légères modifications de balisage. Dans votre composant:

  constructor(private formBuilder: FormBuilder) {
    this.myGroup = this.formBuilder.group({
      myCategory: this.formBuilder.array(this.categoriesSelected)
    });
  }

Vous pouvez utiliser l'index du ngFor pour accéder au tableau categories distinct pour étiqueter les cases à cocher:

<form [formGroup]="myGroup">
    <div *ngFor="let category of myGroup.controls['myCategory'].controls; let i = index">
        <input type="checkbox" [formControl]="category">
    <label>{{ categories[i].name }}</label>
    </div>
  Selected: <strong>{{ myGroup.get('myCategory').value }}</strong>
</form>

Démo: https://stackblitz.com/edit/angular-vntktv

5
inorganik

Case à cocher dynamique avec Angular

 musicForm: FormGroup;
 musicPreferences = [
 { id: 1, genre: 'Pop' },
 { id: 2, genre: 'Rock' },
 { id: 3, genre: 'Techno' },
 { id: 4, genre: 'Hiphop' }
 ];

 this.musicForm.get('selectAll').valueChanges.subscribe(bool => {
    this.musicForm
      .get('musicPreferences')
      .patchValue(Array(this.musicPreferences.length).fill(bool), { emitEvent: 
 false });
  });
 this.musicForm.get('musicPreferences').valueChanges.subscribe(val => {
  const allSelected = val.every(bool => bool);
  if (this.musicForm.get('selectAll').value !== allSelected) {
    this.musicForm.get('selectAll').patchValue(allSelected, { emitEvent: false 
 });
  }
});


  submit() {
// Filter out the unselected ids
const selectedPreferences = this.musicForm.value.musicPreferences
  .map((checked, index) => checked ? this.musicPreferences[index].id : null)
  .filter(value => value !== null);
// Do something with the result

}

   <form [formGroup]="musicForm" (ngSubmit)="submit()">
   <label>
    <input type="checkbox" formControlName="selectAll">
 Select/Deselect all
  </label>
  <label formArrayName="musicPreferences" *ngFor="let genre of 
   musicForm.controls['musicPreferences'].controls; let i = index">
  <input type="checkbox" [formControlName]="i">
  {{musicPreferences[i].genre}}
  </label>

  <button>submit</button>
  </form>
0
Flash