Chciałbym powiązać element select z listą obiektów - co jest dość łatwe:
@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;
}
W tym przypadku wydaje się, że selectedValue
byłaby to liczba - identyfikator wybranego elementu.
Jednak tak naprawdę chciałbym powiązać z samym obiektem wiejskim, aby selectedValue
był to obiekt, a nie tylko identyfikator. Próbowałem zmienić wartość opcji tak:
<option *ngFor="#c of countries" value="c">{{c.name}}</option>
ale to nie wydaje się działać. Wydaje się, że umieszcza obiekt w moim selectedValue
- ale nie obiekt, którego oczekuję. Możesz to zobaczyć w moim przykładzie Plunkera .
Próbowałem również powiązać zdarzenie zmiany, aby samodzielnie ustawić obiekt na podstawie wybranego identyfikatora; wydaje się jednak, że zdarzenie zmiany jest uruchamiane przed zaktualizowaniem powiązanego modelu ngModel, co oznacza, że w tym momencie nie mam dostępu do nowo wybranej wartości.
Czy istnieje czysty sposób na powiązanie zaznaczonego elementu z obiektem za pomocą Angular 2?
Odpowiedzi:
Przykład StackBlitz
UWAGA: możesz użyć
[ngValue]="c"
zamiast[ngValue]="c.id"
gdzie c jest kompletnym obiektem kraju.[value]="..."
obsługuje tylko wartości ciągu[ngValue]="..."
obsługuje dowolny typaktualizacja
Jeśli
value
jest to obiekt, wybrana instancja musi być identyczna z jedną z wartości.Zobacz także ostatnio dodane niestandardowe porównanie https://github.com/angular/angular/issues/13268 dostępne od 4.0.0-beta.7
Dbaj o to, jeśli chcesz uzyskać dostęp
this
w ramachcompareFn
.źródło
selectedValue
niż dlac
(domyślny element). Inny obiekt nawet z tymi samymi właściwościami i wartościami nie działa, musi to być ta sama instancja obiektu.To może pomóc:
źródło
let
zamiast#
@ sea-kgMożesz to zrobić również bez potrzeby używania
[(ngModel)]
w<select>
taguZadeklaruj zmienną w swoim pliku ts
toStr = JSON.stringify;
i w tobie zrób to
a następnie użyj
aby ponownie przeanalizować ciąg znaków w poprawny obiekt JavaScript
źródło
To działało dla mnie:
Szablon HTML:
Dodałem
(ngModelChange)="selectChange($event)"
do mojegoselect
.W pliku component.ts:
Musisz dodać do
component.ts
tej funkcji:Uwaga: próbuję
[select]="oneOption.id==model.myListOptions.id"
i nie pracuję.============= Inne sposoby to: =========
Szablon HTML:
Dodałem
[compareWith]="compareByOptionId
do mojegoselect
.W pliku component.ts:
Musisz dodać do
component.ts
tej funkcji:źródło
[ngModel]
a następnie ręcznie ustawić model w niestandardowym wywołaniu zwrotnym zmiany zdefiniowanym w(ngModelChange)
.Na wypadek, gdyby ktoś chciał zrobić to samo przy użyciu formularzy reaktywnych:
Sprawdź działający przykład tutaj
źródło
Możesz wybrać identyfikator za pomocą funkcji
źródło
Dla mnie działa w ten sposób, możesz pocieszyć
event.target.value
.źródło
Ponadto, jeśli nic innego z podanych rozwiązań nie działa, sprawdź, czy zaimportowałeś „FormsModule” do „AppModule”, co było dla mnie kluczem.
źródło
Utwórz kolejny moduł pobierający dla wybranego elementu
W ts:
źródło
Możesz uzyskać wybraną wartość również za pomocą click (), przekazując wybraną wartość przez funkcję
źródło
użyj tej metody również ..
źródło
W
app.component.html
:I
app.component.ts
:źródło
takie podejście zawsze będzie działać, jednak jeśli masz listę dynamiczną, upewnij się, że załadowałeś ją przed modelem
źródło