2012-07-26 50 views
10

這裏有一個的jsfiddle顯示是什麼問題:觸發更改事件當淘汰賽視圖模型屬性更新

http://jsfiddle.net/boblauer/BgvV4/

我試圖觸發更改事件後的文本字段更新。不幸的是,在subscribe方法中,文本框的值還沒有被更新,因此當我計算出更改事件時,它很快就會被觸發。

我需要觸發更改事件,因爲我有第三方代碼不在我的控制之下,依賴於更改事件。

有什麼建議嗎?

+0

更改事件是在第三方代碼中設置的,還是您只需要調用它? – Tyrsius 2012-07-26 16:15:30

+0

更改事件處理程序綁定在第三方代碼中,當我的視圖模型更新我的文本框值時,我需要觸發它。 – 2012-07-26 17:09:37

+0

也許我沒跟着你。如果你想捕獲新的值(它被改變的那個),那麼訂閱方法很好,在你的例子中它正在工作。由於我錯過了什麼,你的預期結果是什麼? – 2012-07-26 18:43:05

回答

7

一個簡單的解決方案是將你的調用打包到setTimeout中的$(「#text1」)。(超時時間爲0)。這足以讓敲除在文本框之前對文本框值進行(同步)更新。 jquery變更處理程序被調用。

我分叉的小提琴證明: http://jsfiddle.net/SuRYa/1//

如果這是你需要做很多事情,更好的解決方案可能是包裝這一行爲在自定義的結合,其中結合的「更新」回調會觸發更新元素上的jQuery更改事件。

+0

不是一個理想的解決方案,但我不相信存在一個理想的解決方案,所以我認爲這可能是我的最佳選擇。感謝您的建議。 – 2012-07-27 17:57:55

0

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的小提琴的更新版本中顯示這個行動:

http://jsfiddle.net/BgvV4/17/

我改變了警報CONSOLE.LOG,所以你需要在控制檯打開看的有用信息。