Ich möchte ein ausgewähltes Element an eine Liste von Objekten binden - was einfach genug ist:
@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;
}
In diesem Fall scheint es selectedValue
sich um eine Zahl zu handeln - die ID des ausgewählten Elements.
Ich möchte jedoch tatsächlich an das Länderobjekt selbst binden, sodass dies selectedValue
eher das Objekt als nur die ID ist. Ich habe versucht, den Wert der Option folgendermaßen zu ändern:
<option *ngFor="#c of countries" value="c">{{c.name}}</option>
aber das scheint nicht zu funktionieren. Es scheint ein Objekt in meinem zu platzieren selectedValue
- aber nicht das Objekt, das ich erwarte. Sie können dies in meinem Plunker-Beispiel sehen .
Ich habe auch versucht, eine Bindung an das Änderungsereignis herzustellen, damit ich das Objekt basierend auf der ausgewählten ID selbst festlegen kann. Es scheint jedoch, dass das Änderungsereignis ausgelöst wird, bevor das gebundene ngModel aktualisiert wird. Dies bedeutet, dass ich zu diesem Zeitpunkt keinen Zugriff auf den neu ausgewählten Wert habe.
Gibt es eine saubere Möglichkeit, ein ausgewähltes Element mit Angular 2 an ein Objekt zu binden?
Antworten:
StackBlitz Beispiel
HINWEIS: Sie können
[ngValue]="c"
anstelle von verwenden[ngValue]="c.id"
c das vollständige Länderobjekt verwenden.[value]="..."
unterstützt nur Zeichenfolgenwerte[ngValue]="..."
unterstützt jeden Typaktualisieren
Wenn das
value
ein Objekt ist, muss die vorausgewählte Instanz mit einem der Werte identisch sein.Siehe auch den kürzlich hinzugefügten benutzerdefinierten Vergleich https://github.com/angular/angular/issues/13268 , der seit 4.0.0-beta.7 verfügbar ist
Achten Sie darauf, ob Sie
this
innerhalb zugreifen möchtencompareFn
.quelle
selectedValue
als fürc
(das Standardelement) zu verwenden. Ein anderes Objekt funktioniert auch mit denselben Eigenschaften und Werten nicht, es muss dieselbe Objektinstanz sein.Dies könnte helfen:
quelle
let
anstelle von#
@ sea-kgSie können dies auch tun, ohne es
[(ngModel)]
in Ihrem<select>
Tag verwenden zu müssenDeklarieren Sie eine Variable in Ihrer ts-Datei
toStr = JSON.stringify;
und in Ihrer Vorlage tun Sie dies
und dann verwenden
um die Zeichenfolge wieder in ein gültiges JavaScript-Objekt zu analysieren
quelle
Es hat bei mir funktioniert:
HTML-Vorlage:
Ich fügte
(ngModelChange)="selectChange($event)"
meinem hinzuselect
.Auf component.ts:
Und Sie müssen zu
component.ts
dieser Funktion hinzufügen :Hinweis: Ich versuche es mit
[select]="oneOption.id==model.myListOptions.id"
und arbeite nicht.============= Eine andere Möglichkeit kann sein: =========
HTML-Vorlage:
Ich fügte
[compareWith]="compareByOptionId
meinem hinzuselect
.Auf component.ts:
Und Sie müssen zu
component.ts
dieser Funktion hinzufügen :quelle
[ngModel]
Ihr Modell jedoch nur manuell in Ihren in definierten benutzerdefinierten Änderungsrückruf einfügen(ngModelChange)
.Nur für den Fall, dass jemand das Gleiche mit reaktiven Formularen tun möchte:
Schauen Sie sich das Arbeitsbeispiel hier
quelle
Sie können die ID mithilfe einer Funktion auswählen
quelle
Für mich funktioniert es so, Sie können trösten
event.target.value
.quelle
Wenn nichts anderes aus bestimmten Lösungen nicht funktioniert, überprüfen Sie, ob Sie "FormsModule" in "AppModule" importiert haben. Das war ein Schlüssel für mich.
quelle
Erstellen Sie einen weiteren Getter für das ausgewählte Element
In ts:
quelle
Sie können den ausgewählten Wert auch mit Hilfe von click () abrufen, indem Sie den ausgewählten Wert durch die Funktion übergeben
quelle
benutze diesen Weg auch ..
quelle
In
app.component.html
:Und
app.component.ts
:quelle
Dieser Ansatz wird jedoch immer funktionieren. Wenn Sie eine dynamische Liste haben, stellen Sie sicher, dass Sie diese vor dem Modell laden
quelle