2016-12-02 3 views
1

In Angular (2.2) Ich versuche, eine select mit einem komplexen Objekt zu initialisieren. Aber da das Objekt keine tatsächliche Referenz auf etwas in der Liste select ist (obwohl es identisch ist), erkennt es es nicht als ausgewählt. Hier ist, was ich arbeite mit:Angular 2 Wählen Sie ein komplexes Objekt mit Anfangswert

<select [(ngModel)]="model.object"> 
    <option *ngFor="let obj of objects" [ngValue]="obj">{{ obj.name }}</option> 
</select> 

Dies funktioniert wie vorgesehen, wenn Sie die Auswahl ändern. Aber beim ersten Laden, auch wenn model.object mit einem Objekt in der Liste identisch ist, wird nichts ausgewählt. Die zwei Problemumgehungen dafür sind (1) durch die Liste zu laufen und model.object zu tauschen, um eine direkte Referenz zu sein, aber das ist eine Zeile in einer Tabelle mit vielen Dingen wie dieser, das wird sehr teuer. Oder (2) binde [(ngModel)]="model.object.id" und [ngValue]="object.id" (ein einfacher Typ), aber ich möchte wirklich, dass das ganze Objekt im Modell dargestellt wird, also müsste ich immer noch an den Event-Handler binden und durch das Array von Elementen laufen, bis ich finde diese ID, und setze es selbst.

Ich hatte gehofft, es gab eine Möglichkeit, eine track by Art zu tun, so die erste Auswahl Tracks von ID.

In Angular 1, könnte dies erreicht werden durch:

<select ng-model="model.object" 
    ng-options="obj.id as obj.name for obj in objects"> 

aber ich kann kein Äquivalent zu finden scheinen.

Antwort

3

Sie unten versuchen können,

@Component({ 
    selector: 'my-app', 
    template: `Angular 
    <select (change)="chnageProduct($event.currentTarget.value)" > 
    <option *ngFor="let obj of objects" [value]="obj" 
    [selected]="model.name === obj.name" 
    >{{ obj.name }}</option> 
</select> 
    ` 
}) 
export class AppComponent { 
    result: any = {}; 

    constructor(){ 
    } 

    model = {name : "1"} 


    objects = [{name : "1"},{name: "2"}] 

    chnageProduct(val){ 
    this.model = val; 
    } 
} 

Hier ist die Plunker !!

Hoffe das hilft !!

+1

Cool, ich denke, ich muss damit gehen. Es ist schade, dass wir das native 'ngModel' nicht mehr verwenden können. Dies scheint ein häufiges Szenario/eine Kontrolle ihrerseits zu sein. Vielen Dank! – JonG

+0

@JonG Rate mal was ?! Sie haben bemerkt;) Benutzerdefinierte Komparator-Funktion als Parameter ist auf dem Weg https://github.com/angular/angular/issues/13268 – kub1x

+0

Dies funktioniert überhaupt nicht. Ich habe gerade den Plunker ausgeführt und die Zeichenkette "[Objekt Objekt]" im Modell der Komponente gesetzt. Kein Objekt. Hat das früher funktioniert? – JDTLH9

Verwandte Themen