2011-08-05 36 views
4

的財產,是可以綁定到來自服務器的JSON對象的子對象的屬性?特別是,如果我給來自看起來像這樣的服務器對象:綁定文本使用knockout.js子對象

var obj = { 
    list: [ { key: "a", value: 1 }, 
      { key: "b", value: 2 }, 
      { key: "c", value: 3 }   
     ], 
    selected: { 
     key: "", 
     value: null 
    } 
}; 

我從這個JavaScript對象通過「映射」插件創建一個視圖模型:

var viewModel = ko.mapping.fromJS(obj); 

我綁定list<select>標籤,像這樣:

<select data-bind="options: list, optionsText: 'key', 
        optionsValue: 'value', 
        value: selected"> 
</select> 

我分配的值是我的ViewModel的selected財產。這意味着,在選擇一個選項,我能夠成功查詢viewModel.selected.key()viewModel.selected.value()代碼,並獲得向上的最新值。

但是,我無法將所選項目的keyvalue數據綁定到跨度上顯示。例如,這不顯示我選擇的值:

<span data-bind="text: selected.value"></span> 

我可以做我想做的嗎?我是否需要求助於使用真正簡單的模板來建立適當的上下文(即:selected)?

我的情況here一個例子。我甚至嘗試過專門將孩子映射爲可觀察對象本身,但沒有運氣(請參閱使用附加選項註釋映射調用)。

回答

8

你在正確的軌道與映射選項上。你想selected是一個可觀察的,所以你的UI更新,當你在下拉列表中進行更改。在你的情況下,它甚至可能是空的。

有一點要注意的是,當像與對象的映射插件優惠:

selected: { key="", value=null } 

它將使keyvalue觀測,但不selected。那你有

的另外一個問題是,您的第一選擇指定optionsValue: 'value'。這會導致它將對象的value屬性寫入selected而不是對象。

如果你想寫的對象本身,那麼你想徹底刪除optionsValue結合。

這是你擺弄這些更新: http://jsfiddle.net/rniemeyer/Dubu9/2/

+0

好極了,正是我一直在尋找的 - 我懷疑它要來自你。 =)很高興知道我在正確的軌道上做出選擇,本身也是可觀察的。我認爲建立'optionsValue'參數 - 意外 - 是情況的關鍵。再次感謝! – kdawg