這裏有一個的jsfiddle顯示是什麼問題:觸發更改事件當淘汰賽視圖模型屬性更新
http://jsfiddle.net/boblauer/BgvV4/
我試圖觸發更改事件後的文本字段更新。不幸的是,在subscribe方法中,文本框的值還沒有被更新,因此當我計算出更改事件時,它很快就會被觸發。
我需要觸發更改事件,因爲我有第三方代碼不在我的控制之下,依賴於更改事件。
有什麼建議嗎?
這裏有一個的jsfiddle顯示是什麼問題:觸發更改事件當淘汰賽視圖模型屬性更新
http://jsfiddle.net/boblauer/BgvV4/
我試圖觸發更改事件後的文本字段更新。不幸的是,在subscribe方法中,文本框的值還沒有被更新,因此當我計算出更改事件時,它很快就會被觸發。
我需要觸發更改事件,因爲我有第三方代碼不在我的控制之下,依賴於更改事件。
有什麼建議嗎?
一個簡單的解決方案是將你的調用打包到setTimeout中的$(「#text1」)。(超時時間爲0)。這足以讓敲除在文本框之前對文本框值進行(同步)更新。 jquery變更處理程序被調用。
我分叉的小提琴證明: http://jsfiddle.net/SuRYa/1//
如果這是你需要做很多事情,更好的解決方案可能是包裝這一行爲在自定義的結合,其中結合的「更新」回調會觸發更新元素上的jQuery更改事件。
不是一個理想的解決方案,但我不相信存在一個理想的解決方案,所以我認爲這可能是我的最佳選擇。感謝您的建議。 – 2012-07-27 17:57:55
bmode是正確的,自定義綁定將做到這一點。雖然這個答案有點晚,但這裏是綁定的情況下,它可以幫助任何人後來閱讀這篇文章。它使用jQuery更新文本框的值 - 爲了讓Bob的第三方代碼正常工作,現在更新DOM - 然後它會觸發更改事件。
ko.bindingHandlers.valueAndFireChange = {
update: function(element, valueAccessor) {
var val = ko.unwrap(valueAccessor());
if (val == undefined) return;
$(element).val(val);
$(element).change();
}
};
這裏是Bob的小提琴的更新版本中顯示這個行動:
我改變了警報CONSOLE.LOG,所以你需要在控制檯打開看的有用信息。
更改事件是在第三方代碼中設置的,還是您只需要調用它? – Tyrsius 2012-07-26 16:15:30
更改事件處理程序綁定在第三方代碼中,當我的視圖模型更新我的文本框值時,我需要觸發它。 – 2012-07-26 17:09:37
也許我沒跟着你。如果你想捕獲新的值(它被改變的那個),那麼訂閱方法很好,在你的例子中它正在工作。由於我錯過了什麼,你的預期結果是什麼? – 2012-07-26 18:43:05