2013-05-07 6 views
7

Обычно, когда у меня есть список выбора Я связываю его с нокаута, как это:Выбранный вариант Id и значение

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

Но есть проблема с такими обязательными: у вас нет выбранного объекта. У вас есть свой идентификатор. Как слить эти два требования: иметь привязку к самому элементу и элементу элемента?

Сейчас я использую computed наблюдаемую, чтобы получить выбранный элемент, который обычно выглядит следующим образом:

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]; 
}); 

Я попытался обернуть значение геттер, используя пользовательскую функцию, но это называется для каждого элемента при изменении выбора , поэтому здесь нет никаких преимуществ при использовании этого подхода. Here 's jsfiddle.

ответ

7

Удалить параметр optionsValue. Тогда выбранным значением будет «выбранный элемент» вместо Id.

Обновленный код будет:

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

dataSelectedItem теперь будет иметь выбранный элемент.

Как только у вас есть товар. вы можете получить Id от самого объекта, как dataSelectedItem().Id

+0

Я не могу сделать это таким образом, потому что тогда я не могу поместить этот SELECT в форму, которая отправляется на сервер, если я не сделаю дополнительное скрытое поле для выбранного идентификатора. Но использование скрытого поля с привязанным к нему идентификатором сделало бы это. – SOReader

+0

Если вы хотите, чтобы Id как значение SELECT, то использование вычисленного наблюдаемого для выбранного элемента является очень хорошим подходом. – ManojRK

Смежные вопросы