2012-03-05 4 views
0

Я пытаюсь привязать select с помощью KnockoutJS к предопределенному значению, которое приходит из моей модели. Согласно документации, это должно исходить от значения значения, но я не могу предварительно выбрать значение в раскрывающемся списке на основе этого. Вот пример кода, который отражает проблему, которая у меня есть:KnockoutJS select lookup

<script src="Scripts/jquery-1.7.1.js"></script> 
<script src="Scripts/knockout-2.0.0.js"></script> 

<script> 
    $(function() { 

     var viewModel = 
     { 
      Positions: ko.observableArray(
              [ 
               { Id: 1, PositionName: 'Point Guard' }, 
               { Id: 2, PositionName: 'Shooting Guard' }, 
               { Id: 3, PositionName: 'Center' }, 
               { Id: 4, PositionName: 'Small Forward' }, 
               { Id: 5, PositionName: 'Power Forward' } 
              ]), 
      Players: ko.observableArray(
              [ 
               { Id: 1, Name: 'Derrick Fisher', Position: 'Point Guard' }, 
               { Id: 2, Name: 'Kobe Bryant', Position: 'Shooting Guard' }, 
               { Id: 3, Name: 'Andrew Bynum', Position: 'Center' }, 
               { Id: 4, Name: 'Metta World Peace', Position: 'Small Forward' }, 
               { Id: 5, Name: 'Pau Gasol', Position: 'Power Forward' } 
              ]) 
     }; 

     ko.applyBindings(viewModel); 

    }); 
</script> 

В моих привязок я хотел бы использовать простую таблицу, где первая колонка предварительно выбранного значения подстановки, в данном случае «позиции» игрока по умолчанию. Вот пример:

<table> 
    <thead> 
     <tr> 
      <td>Position</td> 
      <td>Player</td> 
     </tr> 
    </thead> 
    <tbody data-bind='foreach: Players'> 
     <tr> 
      <td> 
       <select data-bind="options: $root.Positions, optionsText:'PositionName', 
           value:'$data.Position', optionsCaption: 'Choose...'"> 
       </select> 
      </td> 
      <td> 
       <span data-bind='text: Name'></span>         
      </td> 
     </tr> 
    </tbody> 
</table> 

В поисках, похоже, связывает в порядке (выбранный заполняются все значения положения в поиске), однако позиция данного игрока не выбрана по умолчанию. Может ли кто-нибудь обнаружить, где я сделал плохое предположение или ошибку?

ответ

1

Если вы не используете optionsValue, тогда он будет записывать выбранный объект в то, что вы связали с value.

Если у вашего player есть отдельная копия объекта position, то он не будет соответствовать.

Например,

var a = { Id: 3, Name: 'Andrew Bynum', Position: 'Center' }; 
var b = { Id: 3, Name: 'Andrew Bynum', Position: 'Center' }; 

alert(a === b); //false they are not a reference to the same object 

Итак, ваш игрока необходимо либо использовать ссылку на тот же объект или вы должны указать optionsValue связывания с Id, так что он читает/пишет идентификатор позиции игрока имущество.

+0

Благодарим за помощь! Я пытался уйти с примера 4 на http://knockoutjs.com/documentation/options-binding.html, но в этом случае вы правы, просто нужно было привязать optionsValue – t3rse

0

Вы не указали, где $ data.Position происходит.
Вам может понадобиться установить optionsValue, а также, http://knockoutjs.com/documentation/options-binding.html

Это позволяет сделать значение привязки к свойству, а не объект JS.

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

  • Нет связанных вопросов^_^