2012-06-13 34 views
1

http://jsfiddle.net/CsrrD/淘汰賽SelectedOptions結合「已選擇」屬性

給定一個對象

var viewModel = { 
    Opts: ko.observableArray([ 
    { d: 'a', v: 0, selected: 1}, 
    { d: 'b', v: 1, selected: 1}, 
    { d: 'c', v: 2, selected: 1}, 
    { d: 'd', v: 3, selected: 2}, 
    { d: 'e', v: 4, selected: 1}, 
    { d: 'f', v: 5, selected: 1} 
    ]), 
    selectedOpts: ko.observableArray([]) 
}; 

我要綁定多選擇列表以改變「選擇」屬性的值,1爲假的,2是真的。 (它是如何在服務器上代表 - 它實際上是狀態碼)

<select data-bind="options: Opts, 
    optionsText: 'd', 
    optionsValue: 'v', 
    selectedOptions: selectedOpts, 
    optionsCaption: 'Choose...'" multiple=""></select> 

我知道,我不會需要selectedOpts對象,如果我可以綁定selectedOptions結合所選擇的屬性,我只是如果不設置手動訂閱selectedOpts以查看值列表並手動設置每個選定項目的選定屬性,則無法完成此操作。

我相信有一個簡單的方法。

謝謝

回答

1

手動訂閱並不那麼可怕,而且可能非常有用。我已經修改了你的小提琴演示如何容易,這將是完成,如果你只是讓被選屬性觀察到:

http://jsfiddle.net/CsrrD/4/

從設計的角度來看只是一個提示,在訂閱功能也許應該住在你的ViewModel對象,你可能想使用映射插件來避免手動觀察創建,但你明白了。

+0

是的,這是我最初考慮的方法,我將採取。我們在解決方案中使用的真實視圖模型是一種「映射」視圖模型,我只是對這個示例很簡單。謝謝daedalus28 :) –

+0

我編輯了我的具體使用小提琴 - http://jsfiddle.net/CsrrD/ 再次感謝。在我的解決方案中,我還在ko.applyBindings之前添加了一個手動循環,以便在opts中查看是否有狀態爲2/1,並在編輯視圖的情況下相應地更新selectedOpts數組。 –

+1

這些小提琴似乎不見了。任何重新上傳的機會? – user2424495

2

沒有真正的方法來自動做你想做的。

,你將有一些選擇:

  • 設置手動訂閱的observableArray,爲你指示,並依次通過設置基於它是否是數組
  • 創造價值的選項你的選項,以便selected是一個計算的觀察值,根據它是否在數組中保持其自身更新。不足之處在於,每當更新observableArray(低於單個手動訂閱效率)時,每個選項都會觸發一次計算。
  • 編寫一個自定義綁定,查找selectedOptions並執行綁定中的預訂。也許你會提供一個功能來執行每個選項,如:http://jsfiddle.net/rniemeyer/ds2aE/
+0

謝謝RP。我喜歡你的自定義綁定示例,但我認爲它可能是過度工程,因爲手動訂閱/循環看起來很簡單,如下面的daedalus28所示。 –

+1

是的,我會使用手動訂閱。只是想讓你知道你有幾個選項。 –