2012-10-24 16 views
2

以下是設置:如何取消Knockout.JS中從屬觀察值的下拉菜單的「更改」事件?

用戶在頁面「A」上。有一個下拉(DROPDOWN)用於導航。 用戶可以從中選擇2個選項:A,B。其中A代表當前頁面,B代表用戶想要去的地方。

此下拉列表綁定到一個依賴的可觀察對象(GUARD),它可以讀取並且可以或不可以寫入另一個保存該下拉列表的狀態的常規可觀察對象(TARGET)。

DROPDOWN < - - > GUARD < - ? - >目標

的想法是,如果用戶選取下拉東西從頁面進行瀏覽,我們首先檢查是否有任何未保存如果有變化,我們會詢問用戶是否要丟棄它們或保留在頁面上並繼續編輯。

所以情況: 還有未保存的變化。用戶從下拉列表中選擇一些內容。 GUARD通過調用「寫入」方法進行操作。我們會提示用戶他是否想要放棄更改並導航離開頁面或停留。用戶選擇留下。我們說'很好',寫入方法沒有做任何事情,所以目標可觀察性保持不變。故事結局!但是...

當用戶觸摸下拉菜單並且'更改'甚至沒有被取消(在綁定的可觀察對象內部沒有辦法做到這一點),下拉菜單就好像用戶選擇了狀態「B」導航離開頁面。

所以我的問題很簡單:

  • 有沒有辦法取消從withing因觀察到的下拉的「寫」的方法被綁定到「變」事件?

  • 如果不是,我該如何擺脫這種情況,保持下拉選擇與目標可觀測值同步?

回答

2

「更改」事件發生後的下拉列表已經改變,所以一個簡單的解決辦法是使下拉菜單「刷新」使用舊值,具有target.valueHasMutated()一個電話輕鬆完成。 示例小提琴:http://jsfiddle.net/KXhem/77/

編輯:自從淘汰賽3以來,計算機的只有在它們的值真的發生了變化時纔會通知。要獲得相同的行爲,您可以將.extend({ notify: 'always' })添加到計算結果中。 查看完整的細節在這裏:http://knockoutjs.com/upgrade-notes/v3.0.0.html

+0

完美的,你剛纔救了我大量的神經和時間 –

+0

的似乎不與淘汰賽3的工作:http://jsfiddle.net/KXhem/204/ – billy

+0

右鍵,在淘汰賽3計算機只有在它們的值真的發生變化時纔會通知。爲了得到相同的行爲,你可以在計算中添加'.extend({notify:'always'})''。在這裏查看完整的詳細信息:http://knockoutjs.com/upgrade-notes/v3.0.0.html – antishok