2016-06-06 7 views
25

Sono riuscito a ottenere un elenco Seleziona da associare al mio modello allo scopo di salvare, ma non riesco a capire come rendere Angular2 seleziona automaticamente l'opzione corretta nell'elenco Seleziona se sto fornendo funzionalità di modifica. In altre parole, se sto modificando un oggetto preesistente tramite un modulo, ho bisogno dell'elenco Seleziona per riflettere lo stato iniziale dell'oggetto (ad esempio l'opzione 5 nell'elenco di selezione), piuttosto che l'impostazione predefinita per il primo elemento .Imposta l'elemento inizialmente selezionato in Seleziona elenco in Angular2

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

Come immagino dovrebbe funzionare, ma non lo fa!

<select [ngModel]="originalObject"> 
    <option *ngFor="let object of objects" [ngValue]="object" [selected]="object === originalObject">{{object.name}}</option> 
</select> 

Quindi, in sostanza che sto cercando di fare uso della proprietà 'selezionata' in opzione, ma per qualsiasi motivo non fa nulla. L'oggetto "selectedObject" in questo caso sarebbe un oggetto nel componente che può leggere.

+1

La proprietà 'selected' è sovrascritta da' originalObject'. 'ngValue' funziona solo con' ngModel'. Senza 'ngValue' puoi usare solo valori stringa, non oggetti con'

+0

Al momento non sto usando il '[selected] = ..', è stato proprio il modo in cui pensavo che avrebbe dovuto funzionare. Al momento non è presente ma non seleziona l'opzione corretta sul carico. – user3452805

risposta

34

Ok, quindi ho capito qual era il problema e l'approccio che credo funzioni meglio. Nel mio caso, poiché i due oggetti non erano identici da una prospettiva Javascript, come in: potrebbero aver condiviso gli stessi valori, ma erano diversi oggetti reali, ad es. originalObject è stato istanziato completamente separatamente da objects che era essenzialmente una matrice di dati di riferimento (per popolare il menu a discesa).

Ho trovato che l'approccio che ha funzionato meglio per me era quello di confrontare una proprietà unica degli oggetti, piuttosto che confrontare direttamente i due interi oggetti. Questo confronto viene fatto nella proprietà bound selected:

<select [ngModel]="originalObject"> 
    <option *ngFor="let object of objects" [ngValue]="object" [selected]="object.uniqueId === originalObject.uniqueId">{{object.name}}</option> 
</select> 
+0

ho provato questo ancora nessun risultato proveniente http://stackoverflow.com/q/43311162/ 4773561 –

+0

Questo funziona! , devi rimuovere [ngModel] = "originalObject" dall'istruzione select:

+0

L'aspetto importante è che due istanze distinte con le stesse proprietà identiche non corrispondono. cioè recuperato da diverse chiamate API (che era il mio caso). Quindi basta sostituire il puntello utilizzato come valore con quello delle opzioni che segue: myObj = this.options.filter (o => o.id === myObj.id) [0]; Basta notare che quindi la modifica dell'oggetto lo aggiornerà anche nella raccolta delle opzioni. – y0uri

0

Funzionerà, se si rimuove l'elemento modificato dall'array e lo si preme all'inizio dell'array, in modo che venga selezionato automaticamente?

+0

Questa è una buona idea, anche se hackky, ma potrebbe essere una soluzione possibile per ora. Non segnerò come risolto per ora, a meno che non ci sia un modo "corretto" per farlo. – user3452805

7

Se si utilizza

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

È necessario impostare la proprietà object in voi classe di componenti per l'elemento da objects che si desidera hanno pre-selezionati.

class MyComponent { 
    object; 
    objects = [{name: 'a'}, {name: 'b'}, {name: 'c'}]; 
    constructor() { 
    this.object = this.objects[1]; 
    } 
} 
+0

Mi scuso, penso di aver accidentalmente chiamato due oggetti 'oggetto' nella domanda. Ho modificato la domanda ora. Gli oggetti 'originalObject' e' objects' esistono e contengono dati. 'originalObject' è essenzialmente ciò che dovrebbe essere la voce di elenco selezionata, e' objects' è l'array di opzioni possibili, una delle quali sarebbe 'originalObject'. – user3452805

+0

[** Plunker esempio **] (https://plnkr.co/edit/a9vlFiB6GuoIbmksWA8c?p=preview) esattamente come nella mia risposta. –

+0

Ah, capisco.Sembra che potrebbe essere un riferimento? Se modifichi il codice nel Plunker su 'this.originalObject = {nome: 'b'};', l'elenco di selezione non sarà più predefinito su 'b', piuttosto sul valore predefinito sul primo elemento dell'array,' a' . Qualche idea su questo? – user3452805

32

Update per 4.XX angolare, c'è un nuovo modo per marcare l'opzione selezionata:

<select [compareWith]="byId" [(ngModel)]="selectedItem"> 
    <option *ngFor="let item of items" [ngValue]="item">{{item.name}} 
    </option> 
</select> 

byId(item1: ItemModel, item2: ItemModel) { 
    return item1.id === item2.id; 
} 
+4

Mi ci sono volute ore prima di trovare questa risposta. Mi ha salvato la giornata. –

+1

Inoltre richiede l'attributo name per l'elemento select. Altrimenti ricevo un errore –

0

È possibile ottenere lo stesso utilizzando <select [ngModel]="object"> <option *ngFor="let object of objects;let i= index;" [value]="object.value" selected="i==0">{{object.name}}</option> </select>

Problemi correlati