2012-12-18 97 views
8

這似乎是結合<event>Bubble: false只有當有a defined event handler見注4)爲<event>工作。knockoutjs:防止事件冒泡的元素沒有處理

下面是一個示例fiddle

對於有某些事件的處理程序本土元素(例如點擊:<textarea><a><select>等),其中原生處理器就足夠了,我希望設置綁定,例如clickBubble: false他們,而無需綁定「假」處理程序,工作。

我想我的問題是,是否有另一種淘汰賽的方式來實現這個沒有額外的綁定?

回答

22

Bubble處理程序不是實際的綁定處理程序,而是在event綁定(click綁定調用event綁定)中用作選項。所以,他們不會自行運行。

因此,您可以添加一個「僞造」無操作處理程序並使用clickBubble,或者您可以選擇創建自定義綁定來爲您執行此操作。

也許是這樣的:

ko.bindingHandlers.preventBubble = { 
    init: function(element, valueAccessor) { 
     var eventName = ko.utils.unwrapObservable(valueAccessor()); 
     ko.utils.registerEventHandler(element, eventName, function(event) { 
      event.cancelBubble = true; 
      if (event.stopPropagation) { 
       event.stopPropagation(); 
      }     
     }); 
    }   
}; 

然後只是把:

<input data-bind="preventBubble: 'click'" /> 

您還可以進一步提高,如果必要接受事件的數組。

樣品:http://jsfiddle.net/rniemeyer/WcXwZ/

+0

謝謝,RP。我認爲按照你的小提琴,「utils」庫的自定義綁定和使用對於多ViewModel應用程序來說更具吸引力,並且對於每個VM類中的shogue處理程序都是可重用的。我已經回答了你的答案,並且只是在一天左右的時間裏提出這個問題,以便公平地對其他解決方案進行調整。我不會忘記選擇最優雅/有用的誠實引擎。 – Steven