Je voudrais lier un élément select à une liste d'objets - ce qui est assez simple:
@Component({
selector: 'myApp',
template: `<h1>My Application</h1>
<select [(ngModel)]="selectedValue">
<option *ngFor="#c of countries" value="c.id">{{c.name}}</option>
</select>`
})
export class AppComponent{
countries = [
{id: 1, name: "United States"},
{id: 2, name: "Australia"}
{id: 3, name: "Canada"},
{id: 4, name: "Brazil"},
{id: 5, name: "England"}
];
selectedValue = null;
}
Dans ce cas, il semble que ce selectedValue
serait un nombre - l'id de l'élément sélectionné.
Cependant, j'aimerais en fait me lier à l'objet pays lui-même afin que ce selectedValue
soit l'objet plutôt que juste l'id. J'ai essayé de changer la valeur de l'option comme ceci:
<option *ngFor="#c of countries" value="c">{{c.name}}</option>
mais cela ne semble pas fonctionner. Il semble placer un objet dans mon selectedValue
- mais pas l'objet que j'attends. Vous pouvez le voir dans mon exemple Plunker .
J'ai également essayé de me lier à l'événement change afin de pouvoir définir l'objet moi-même en fonction de l'ID sélectionné; cependant, il semble que l'événement change se déclenche avant la mise à jour du ngModel lié - ce qui signifie que je n'ai pas accès à la nouvelle valeur sélectionnée à ce stade.
Existe-t-il un moyen propre de lier un élément de sélection à un objet avec Angular 2?
Réponses:
Exemple StackBlitz
REMARQUE: vous pouvez utiliser à la
[ngValue]="c"
place de[ngValue]="c.id"
où c est l'objet pays complet.[value]="..."
prend uniquement en charge les valeurs de chaîne[ngValue]="..."
prend en charge tout typemise à jour
S'il
value
s'agit d'un objet, l'instance présélectionnée doit être identique à l'une des valeurs.Voir également la comparaison personnalisée récemment ajoutée https://github.com/angular/angular/issues/13268 disponible depuis 4.0.0-beta.7
Prenez soin de si vous souhaitez accéder à l'
this
intérieurcompareFn
.la source
selectedValue
que pourc
(l'élément par défaut). Un objet différent même avec les mêmes propriétés et valeurs ne fonctionne pas, il doit s'agir de la même instance d'objet.Cela pourrait aider:
la source
let
au lieu de#
@ sea-kgVous pouvez le faire aussi sans avoir besoin de l'utiliser
[(ngModel)]
dans votre<select>
tagDéclarez une variable dans votre fichier ts
toStr = JSON.stringify;
et dans votre modèle faites ceci
puis utiliser
pour réanalyser la chaîne dans un objet JavaScript valide
la source
Cela a fonctionné pour moi:
Modèle HTML:
J'ai ajouté
(ngModelChange)="selectChange($event)"
à monselect
.Sur component.ts:
Vous devez ajouter à
component.ts
cette fonction:Remarque: j'essaie avec
[select]="oneOption.id==model.myListOptions.id"
et ne fonctionne pas.============= Une autre façon peut être: =========
Modèle HTML:
J'ai ajouté
[compareWith]="compareByOptionId
à monselect
.Sur component.ts:
Vous devez ajouter à
component.ts
cette fonction:la source
[ngModel]
puis de définir manuellement votre modèle dans votre rappel de modification personnalisé défini dans(ngModelChange)
.Juste au cas où quelqu'un chercherait à faire de même en utilisant des formulaires réactifs:
Consultez l'exemple de travail ici
la source
Vous pouvez sélectionner l'ID à l'aide d'une fonction
la source
Pour moi, ça fonctionne comme ça, vous pouvez consoler
event.target.value
.la source
De plus, si rien d'autre des solutions données ne fonctionne, vérifiez si vous avez importé "FormsModule" dans "AppModule", c'était une clé pour moi.
la source
Créer un autre getter pour l'élément sélectionné
En ts:
la source
Vous pouvez également obtenir la valeur sélectionnée à l'aide de click () en passant la valeur sélectionnée via la fonction
la source
utilisez également cette méthode ..
la source
Dans
app.component.html
:Et
app.component.ts
:la source
cette approche va toujours fonctionner, mais si vous avez une liste dynamique, assurez-vous de la charger avant le modèle
la source