2014-03-05 17 views
0

我使用JS淘汰賽捉值的更新,而我試圖創建一個簡單的用戶界面,其中一個系列的下拉列表中被用來觸發一個動作是依賴於與價值一個參數。自動復位<select>與參數淘汰賽

例如如果我有一個頁面給出兩輛車的詳細信息,並且我想將它們分配給下拉列表中的值。

什麼是最簡單的方法,利用基因敲除提供一個參數(告訴我,無論是車輛的一個或車輛二),並有下拉選擇直後自行復位。

我已經試過值綁定計算的觀測,但我無法得到的選擇本身立即選擇後復位。

我試圖用一個標準的功能與JavaScript和綁定功能,在參數傳遞,但這並沒有幫助。

http://jsfiddle.net/7U45W/ 這是我到目前爲止,但我有兩個問題是:

  1. 改變選擇的價值似乎並不調用write功能
  2. 如果我撥弄它足夠我可以得到它來調用寫功能,但然後我找不到一種方式(沒有訴諸於純粹的DOM操縱設置<select>框回到第一個選項。

NB我已經嘗試了兩種不同的方式來綁定updateAssignment函數,但它們都不起作用。

這是需要自定義綁定或擴展綁定的東西嗎?還是有更簡單的方法,我錯過了?

回答

2

我不確定它是否是一個不錯的用戶界面(很難瀏覽和使用鍵盤進行選擇)。這就是說,這並不難實現。由於read值永遠不會更改,因此我們需要確保在調用write函數時通知訂閱者(並因此更新綁定的DOM元素),即使read值自上次以來未發生更改。

舊答案包含使用兩個觀測和手動訂閱(其可以在http://jsfiddle.net/Emca9/可見)中的溶液。這個編輯答案(更新小提琴在http://jsfiddle.net/Emca9/1/)使用兩個observable,其中之一是一個可寫的計算observable,因爲這是在評論中請求。

綁定select元件類似如下:

<select data-bind="options: $parent.drivers, 
        optionsText: 'name', 
        value: selectedDriver, 
        optionsCaption: 'Select driver'"> 
</select> 

在所計算的觀察到的write功能,確保用戶被通知,以確保它們的bindingHandlers更新DOM元件(即所選擇的選項)。

function CarViewModel(data){ 
    var self = this; 

    // ... removed other properties for brevity 

    self.todaysDriver = ko.observable(); 
    self.selectedDriver = ko.computed({ 
     read: function(){ 
      return undefined; 
     }, 
     write: function(newValue){ 
      if (newValue){ 
       self.todaysDriver(newValue); 
       self.selectedDriver.notifySubscribers(); 
      } 
     } 
    }); 
} 
+0

羅伯特你好。感謝您向我展示這個解決方案,我將更詳細地看看它,但它似乎使用foreach:綁定而不是參數傳遞來區分車輛。我對涉及將參數傳遞給計算的可觀察函數的技術特別感興趣 - 抱歉,這個問題沒有被充分強調。 – ec2011

+0

我不確定「將參數傳遞給計算的可觀察函數」是什麼意思。計算的observable不應該是一個多參數函數,因爲你會使用普通函數。如果你的計算觀察值需要多個值來計算返回值,它應該讀取viewModel('this'或'self'對象)的屬性。然而,我已經更新了使用可寫計算觀察值的答案。 –

+0

聽起來好像我在這裏叫錯了樹。是否有可能使用常規功能代替觀察對象,但仍然有淘汰賽更新顯示?我認爲我遇到麻煩的原因是我試圖找到在viewModel中重用頁面上多個