2012-05-10 10 views
19

domanda simile come: Select element's initial valueKnockoutJS Selezionare Opzioni e selezionato Valore

sto avendo una impostazione del valore iniziale dell'elemento select problema. Fondamentalmente ho un elenco di dati seme provenienti dal server per compilare l'elenco a discesa e voglio che il valore selezionato rappresenti ciò che dovrebbe essere selezionato dall'entità.

Poiché il valore selezionato del modello dati non è uguale al riferimento oggetto nei dati seme, non è selezionato nulla.

In questo momento, eseguo il looping di ciascuna entità, trovando il valore selezionato corretto, impostando quello uguale all'equivalente dei dati seme, quindi Knockout sa come collegarlo.

C'è una soluzione più elegante che questo? Ho simulato un esempio semplificato con maggiori dettagli ... http://jsfiddle.net/hbrYM/14/

risposta

34

Come hai indovinato correttamente il riferimento Valore selezionato non corrisponde, quindi KO non seleziona quell'elemento. Il modo per farlo funzionare è non salvare l'oggetto complesso nel valore selezionato e selezionare invece l'ID, in quanto un uguaglianza di tipo primitivo può avere successo e viene selezionato il valore corretto.

http://jsfiddle.net/VLTFB/3/

Avrete bisogno di utilizzare l'opzione optionsValue sulle opzioni di rilegatura (se questo ha un senso :)

<select data-bind="options: seedData, 
        optionsText: 'firstName', 
        optionsValue: 'ID', 
        value: data.selectedValue"> 

EDIT

Come detto è possibile selezionare nuovamente il corretto oggetto con un calcolo (non testato).

vm.currentlySelected = ko.computed(function() { 
    for (var i = 0; i < this.seedData().length; i += 1) { 
     var data = this.seedData()[i]; 
     if (data.ID === this.selectedValue()) { 
      return data; 
     } 
    } 
    return null; 
}, vm); 

Spero che questo aiuti.

+0

Grazie per la risposta, ha senso. Attualmente rimando l'oggetto (non solo l'ID) che viene quindi deserializzato e persistente. Speravo davvero che ci fosse un modo per "istruire" KO su come collegarlo perché ho così tanti diversi selezioni in questa particolare interfaccia ... – aswallows

+1

Puoi ancora inviare indietro l'oggetto abbastanza facilmente solo quando i dati selezionati dal server entra, basta inviare l'id. Quando hai bisogno di inviare un nuovo back selezionato, scrivi semplicemente un calcolo che recupera l'oggetto attualmente selezionato (vedi modifica). In realtà è più snello farlo in questo modo, hai già i dati seme, quindi perché preoccuparsi di inviare di nuovo tutte queste informazioni extra. – madcapnmckay

+0

Grazie per il feedback! Darò un'occhiata a usando quell'approccio. – aswallows

Problemi correlati