2011-12-22 15 views
10

Sto cercando di utilizzare il valore vincolante per l'elemento di selezione, come descritto in questo violino: http://jsfiddle.net/MikeEast/nM6dd/2/valore vincolante nel KnockoutJs non riesce per selezionare quando avere tipi complessi

Tuttavia, non riesco a essere in grado di impostare il selezionato opzione (valore vincolante).

So che posso usare il binding OptionValue, ma che rende il valore una stringa anziché un oggetto che non è preferibile. Se quello è l'unico modo per andare, come farei per garantire che l'opzione selezionata venga riscritta sul modello di visualizzazione?

Grazie!

risposta

17

Ecco la soluzione. È necessario aggiungere l'attributo optionsValue: 'id' al collegamento dati. Devi anche mettere una funzione nel tuo viewModel che restituisce l'oggetto selezionato.

HTML

<select data-bind="options: items, optionsText: 'name', optionsValue: 'id', value: selectedItemId"></select> 
<span data-bind="text: selectedItem().name"></span> 

JS

var viewModel = function() { 
    this.items = ko.observableArray([ 
     { id: 1, name: "Apple" }, 
     { id: 2, name: "Orange"}, 
     { id: 3, name: "Banana"} 
    ]); 
    this.selectedItemId = ko.observable(3); 
    this.selectedItem = function() { 
     var self = this; 
     return ko.utils.arrayFirst(this.items(), function(item) { 
      return self.selectedItemId() == item.id; 
     }); 
    }.bind(this); 
}; 

var vm = new viewModel(); 
ko.applyBindings(vm); 

Cheers!

+0

Grazie per il vostro contributo. Risolve la domanda che ho posto. Tuttavia, il mio problema è radicato in un'altra causa. Sto caricando la matrice dal server in modo asincrono e quando ottengo la risposta imposto il valore di observableArray. Ciò significa che l'ObservableArray ricarica/rebinds che a sua volta fa ignorare il valore * precedentemente impostato. Potrebbe essere di progettazione, ma non ne sono sicuro. Ecco un violino che mostra il comportamento: http://jsfiddle.net/MikeEast/nM6dd/12/ –

+0

Vedo. Il problema è che this.selected è osservabile ed è impostato su 2. Con knockout di progettazione è possibile modificare il valore su this.selected quando si modifica il valore nell'elenco. Perché la lista vuota all'inizio, questa volta selezionata diventa indefinita. Quando lo riempi di default, imposta sul primo elemento. Puoi risolvere questo problema salvando l'elemento selezionato in una variabile e utilizzando la funzione subscribe in knockout. –

Problemi correlati