Il est beaucoup plus facile de faire cela dans Angular 6 que dans les versions précédentes, même lorsque les informations de la case à cocher sont alimentées de manière asynchrone à partir d'une API.
La première chose à savoir, c'est que grâce à l'introduction d'Angular 6 keyvalue
nous n'avons pas besoin d'utiliser le tuyau FormArray
et peuvent à la place imbriquer un FormGroup
.
Tout d'abord, passez FormBuilder dans le constructeur
constructor(
private _formBuilder: FormBuilder,
) { }
Puis initialiser notre formulaire.
ngOnInit() {
this.form = this._formBuilder.group({
'checkboxes': this._formBuilder.group({}),
});
}
Lorsque les données relatives aux options de la case à cocher sont disponibles, elles sont itérées et nous pouvons les pousser directement dans l'élément imbriqué FormGroup
comme un nom FormControl
sans avoir à recourir à des tableaux de consultation indexés sur le nombre.
const checkboxes = <FormGroup>this.form.get('checkboxes');
options.forEach((option: any) => {
checkboxes.addControl(option.title, new FormControl(true));
});
Enfin, dans le modèle, il nous suffit d'itérer les fichiers keyvalue
des cases à cocher : aucune let index = i
et les cases à cocher seront automatiquement classées par ordre alphabétique : beaucoup plus propre.
<form [formGroup]="form">
<h3>Options</h3>
<div formGroupName="checkboxes">
<ul>
<li *ngFor="let item of form.get('checkboxes').value | keyvalue">
<label>
<input type="checkbox" [formControlName]="item.key" [value]="item.value" /> {{ item.key }}
</label>
</li>
</ul>
</div>
</form>
0 votes
Avez-vous trouvé une solution ?
0 votes
Il s'agit probablement de la façon la plus sophistiquée de faire des cases à cocher dans un formulaire. Ce n'est pas du tout simple.
0 votes
@mwilson vous plaignez vous spécifiquement de mon implémentation ou d'Angular ?
10 votes
Angular. Tout ce que j'essaie de faire, c'est de lier un groupe de radios à mon formulaire réactif. Je ne me souviens pas avoir eu autant de mal avec Angular. Tous les articles pointent vers la même chose. Je n'arrive pas à le faire fonctionner. Tout le reste est super simple. Je l'ai probablement regardé trop longtemps. J'ai toujours l'impression que c'est beaucoup trop complexe pour une valeur de tableau dans un formulaire.
7 votes
Oui c'était terrible quand j'ai posé la question en 2016, et ça l'est toujours en 2019.
6 votes
Je n'apporte pas grand-chose à cette question, mais je voulais faire savoir aux autres que je ressens la même chose. Cela seul a été la partie la plus difficile dans l'apprentissage des formes réactives angulaires. J'ai l'impression que ça ne devrait pas être aussi difficile, du tout. Je suis heureux de voir que je ne suis pas seul dans cette lutte. Alors merci d'avoir posté la question.
0 votes
c'est fou, et toutes les solutions sont complexes pour rassembler de simples valeurs cochées, c'est un bon exemple de gros framework qui rend les choses simples plus complexes. ma solution simple et stupide est d'avoir une entrée ng cachée pour la question réelle, et d'utiliser du html basique (pas de bindings ng)+js pour rendre et gérer l'événement onchange, qui ensuite rassemble et met les données que je veux dans l'entrée ng cachée pour que ng les récupère.
2 votes
Les ReactiveForms et la gestion des groupes de cases à cocher et de boutons radio sont à peu près la chose la plus horrible d'Angular. J'aime la sécurité des types et la structure OOP, mais ce problème à lui seul est suffisant pour que j'envisage d'autres solutions.
0 votes
Hey @MartinSotirov, je suis tout à fait d'accord avec vous ! C'est fou comme Angular n'a toujours pas de moyen simple de résoudre ce problème. Après beaucoup de recherches et de tests, j'ai été en mesure de trouver une solution élégante, vous pourriez vouloir vérifier et voir ce que vous pensez : stackoverflow.com/a/69637536/3317037