2014-01-14 53 views
0

我有一些事件代表團輸入工作的偉大,與執行一些任務:微分更改事件與更新淘汰賽視圖模型

$("#myParentWrapperId").delegate("input,textarea,select", 'change keypress', function (e) { 
//runStuff(); 
}); 

<select data-bind="value:MyVM.MyPropValue"></select> 

下的另一種方法,我在編程更新視圖模型的一些相同的輸入字段。

self.MyListItems()[idx].MyVM.MyPropValue(data.MyVM.MyPropValue); 

問題是,當我編程方式更新視圖模型的選擇字段,它似乎也被燒成變化事件,並觸發上述事件代表團,我不想要的。

是否有可能之一:

A)還更新視圖模型但它不是選擇觸發onchange事件,但沒有打破依賴的觀測?

或在事件代理

B)上述嗅出並且當用戶導致onchange事件並且當視圖模型更新會導致onchange事件區分?

回答

0

a)仍然更新viewmodel,但讓它不會觸發select的onchange事件,但不會破壞依賴的observables?

從Knockout文檔:「如果您嘗試設置無法在已填充的下拉列表中顯示的模型值,請拒絕該更改,因爲您不允許使用不同意的模型值有可見的用戶界面選擇。「此評論出現在value處理程序觸發change事件之前。

因此,有爲什麼你會從一個綱領性的視圖模型更新得到change事件兩種可能性:

  1. 你設置的是不會在下拉列表中存在的值。如果是這種情況,您可以在設置之前添加代碼以檢查該值是否有效。

  2. 雖然下拉列表中項目的值是字符串,但您將該值設置爲數字類型。雖然Knockout將選擇匹配的項目,但會觸發change事件以指示observable需要更新爲匹配的字符串值。如果是這種情況,您可以確保在設置observable時將值轉換爲字符串。

B)在事件代理以上嗅出並且當用戶導致onchange事件並且當視圖模型更新會導致onchange事件區分?

我無法確定哪些瀏覽器支持此功能,但該事件可能有isTrusted屬性,您可以檢查。參考:http://www.w3.org/TR/DOM-Level-3-Events/#h3_trusted-events

+0

幹得好,我正在用選擇值的int更新viewmodel。用它來解決問題。謝謝!!非常感謝您的幫助。 – user3195170