J'ai une liste de questions comme ci-dessous.
<div *ngFor="let question of questionList"> {{question.question.query}} <br> <div *ngFor="let option of question.options"> <input type="radio" value="{{option.id}}" [(ngModel)]="question.selected.id">{{option.text}} <br> </div> {{question.selected | json}} <br> <br> </div>
Mon intention est de lister les questions avec les options sous forme de boutons radio. Chaque fois que quelqu'un sélectionne une option, l'identifiant de l'option sélectionnée doit être attribué à "selected.id" qui est associé à cette question.
Voici la partie HTML.
public questionList = [ { question:{ id: "Q1", query:"query 1" }, options:[ { id: "opt1", text: "Q1_opt1" }, { id: "opt2", text: "Q1_opt2" } ], selected:{ id:"", text:"" } }, { question:{ id: "Q2", query:"query 2" }, options:[ { id: "opt1", text: "Q2_opt1" }, { id: "opt2", text: "Q2_opt2" } ], selected:{ id:"", text:"" } } ];
3 Réponses :
Il manque l'attribut nom à la radio. Le nom doit être unique pour un ensemble d'options.
Dans votre cas d'utilisation où les boutons radio sont générés dynamiquement, vous pouvez utiliser l'index de la boucle pour définir nom
comme ceci -
<div *ngFor="let question of questionList; let i = index"> {{question.question.query}} <br> <div *ngFor="let option of question.options; let j = index"> <input type="radio" [value]="option?.id" [(ngModel)]="question.selected.id" [name]='"abc"+i+j'>{{option.text}} <br> </div> {{question.selected | json}} </div>
merci ... qui a fonctionné. une autre question ... est-il possible que je puisse attribuer l'option elle-même à "sélectionné" au lieu de option.id?
je pense que "" abc "+ i" est plus que suffisant ... mes boutons radio sont oui / non ... je veux qu'un seul soit sélectionné à la fois.
oui "abc" + i "
devrait fonctionner. Je n'ai pas compris votre prochaine question, pouvez-vous expliquer un peu plus?
dans une application réelle, "l'option" est plus compliquée que celle donnée ici .. elle contient des détails comme la pondération ... lorsque j'envoie la réponse soumise au serveur backend, je voudrais également ajouter ces détails au "sélectionné". par exemple .. dans ce cas, vous pouvez voir que le champ "texte" est manquant dans "sélectionné". comment puis-je le peupler? un moyen facile d'angulaire?
Attribuez un nom au bouton radio
<div *ngFor="let question of questionList; let i = index"> {{question.question.query}} <br> <div *ngFor="let option of question.options"> <input type="radio" [name]= "i" value="{{option.id}}" [(ngModel)]="question.selected.id">{{option.text}} <br> </div> {{question.selected | json}} <br> <br> </div>
Cela ne devrait pas fonctionner, avez-vous essayé cela ?, Comme question.id
pour l'option est différent mais le nom doit être le même pour un ensemble particulier de boutons radio.
fait le changement. Désolé mon mauvais.
Buddy, encore une fois, cela ne fonctionnera pas. Essayez simplement votre réponse sur votre machine
cela fonctionnera car toutes les options auront le même identifiant de la ième boucle
plus tôt dans votre mise à jour, il n'y a pas i
défini, c'est pourquoi je commente
In your array id is same thats why its selecting the option button of other array. you can try this //HTMl code <div *ngFor="let question of questionList"> {{question.question.query}} <br> <div *ngFor="let option of question.options"> <input type="radio" [value]="option" [(ngModel)]="question.selected">{{option.text}} <br> </div> {{question.selected | json}} <br> <br> </div>