2013-05-07 16 views
7

Normalmente quando Ho una lista di selezione I legarsi con eliminazione diretta in questo modo:opzione selezionata Id e il valore

<select 
    data-bind=" 
     options: data, 
     optionsText: 'Name', 
     optionsValue: 'Id', 
     optionsCaption: 'Select ...', 
     value: dataSelectedId" ></select> 

Ma c'è un problema con una tale vincolante: non si ha l'oggetto selezionato. Hai invece il suo ID. Come unire questi due requisiti: avere un legame sia con l'ID dell'oggetto che con l'elemento stesso?

questo momento io uso computed osservabile per ottenere voce selezionata, che di solito si presenta così:

self.dataSelectedCO = ko.computed(function() { 
    for (var i = 0; i < self.data().length; ++i) 
     if (self.data()[i].Id() == self.dataSelectedId()) 
      return self.data()[i]; 
}); 

Ho cercato di avvolgere il valore getter utilizza una funzione personalizzata, ma si chiama per ogni elemento in caso di modifiche di selezione , quindi non ci sono vantaggi qui di usare questo approccio. Here è un jsfiddle.

risposta

7

Rimuovere il parametro optionsValue. Quindi il valore selezionato sarà "l'elemento selezionato" anziché lo Id.

Il codice aggiornato sarà:

<select 
    data-bind=" 
    options: data, 
    optionsText: 'Name', 
    optionsCaption: 'Select ...', 
    value: dataSelectedItem" ></select> 

dataSelectedItem avranno ora l'elemento selezionato.

Una volta ottenuto l'articolo. è possibile ottenere il Id dall'oggetto stesso come dataSelectedItem().Id

+0

Non riesco a farlo in questo modo, perché quindi non posso inserire questo SELECT in un modulo che viene inviato al server a meno che non crei un campo nascosto aggiuntivo per l'ID selezionato. Ma usare il campo nascosto con ID associato potrebbe farlo. – SOReader

+0

Se si desidera che l'Id sia il valore di SELECT, quindi utilizzare osservabile calcolato per l'elemento selezionato è un ottimo approccio. – ManojRK

Problemi correlati