Angular 2: Comment créer des boutons radio à partir d'enum et ajouter la reliure bidirectionnelle?

j'essaie d'utiliser la syntaxe Angular2 pour créer des boutons radio à partir d'une définition enum, et lier la valeur à une propriété qui a le type de cet enum.

mon html contient:

<div class="from_elem">
    <label>Motif</label><br>
    <div  *ngFor="let choice of motifChoices">
        <input type="radio" name="motif" [(ngModel)]="choice.value"/>{{choice.motif}}<br>
    </div>
</div>

dans mon @ Component, j'ai déclaré l'ensemble des choix et des valeurs:

private motifChoices: any[] = [];

et dans le constructeur de mon @ Component, j'ai rempli les choix de la façon suivante:

constructor( private interService: InterventionService )
{
    this.motifChoices =
        Object.keys(MotifIntervention).filter( key => isNaN( Number( key )))
            .map( key => { return { motif: key, value: false } });
}

les boutons radio sont affiche correctement, maintenant je cherche à lier la valeur sélectionnée d'une propriété. Mais quand je clique sur un des boutons le choix de valeur.la valeur est indéfinie.

8
demandé sur Anthony Brenelière 2016-09-08 16:12:10

2 réponses

Ok finalement j'ai trouvé la solution. J'utilise actuellement L'Angular 2 RC5.

La valeur d'enum je veux lier mon radio est la propriété de:

intervention.rapport.motifIntervention : MotifInterventions

dans mon @ Component j'ai déclaré les membres privés pour donner accès à la définition d'enum dans le modèle html:

export class InterventionDetails
{
    private MotifIntervention = MotifIntervention;
    private MotifInterventionValues = Object.values(MotifIntervention).filter( e => typeof( e ) == "number" );

    // model object:
    private intervention: Intervention;

voici le code HTML pour les boutons radio:

<div *ngFor="let choice of MotifInterventionValues">
    <input type="radio"
           [(ngModel)]="intervention.rapport.motifIntervention"
           [checked]="intervention.rapport.motifIntervention==choice"
           [value]="choice" />
    {{MotifIntervention[choice]}}<br>
</div>
  • [(ngModel)]="intervention.rapport.motifIntervention" est bidirectionnel de liaison, il est nécessaire de mettre à jour la propriété dans le modèle (dans mon affaire intervention.rapport.motifIntervention )

  • [checked]="intervention.rapport.motifIntervention==choice" est nécessaire pour mettre à jour le composant des boutons radio si la valeur intervention.un rapport.motifIntervention est modifié extérieurement.

  • [value]="choice" est la valeur qui est attribuée à ma propriété lorsque: le bouton radio est sélectionné.

  • {{MotifIntervention[choice]}} est l'étiquette du bouton radio

16
répondu Anthony Brenelière 2016-09-08 16:57:26

Un peu en retard à la fête, mais cela a fonctionné pour moi:

  <tr *ngFor="let Item of Items; let idx = index" style="line-height: 10px;">
    <td style="font-size:11px;padding-right: 10px;">{{ GetOption(Item) }}</td>                      
    <td><input type="radio" [attr.name]="ComponentID" [id]="ComponentID"
      [value]="GetValue(Item)" [checked]="value == GetValue(Item)" (change)="SelectionChange(GetValue(Item))"></td>           
  </tr>

où:

  • est un tableau d'options
  • ComponentID est le nom du composant
  • GetOption est une fonction qui renvoie la légende que l'option doit utiliser
  • GetValue est une fonction qui renvoie la valeur option doit utiliser
  • selection Modified is utilisé pour mettre à jour le modèle

notez que je n'utilise pas [(ngModel)]

0
répondu Dave Nottage 2018-05-15 00:13:41