2013-01-14 57 views
22

我使用KnockoutJs和Twitter Bootstrap構建UI。在knockoutjs中使用已檢查的綁定時防止事件冒泡

我在一個名爲dropdown-toggle的Bootstrap對話框中使用了checked綁定。

<div class="btn-group"> 
    <a class="btn dropdown-toggle" data-toggle="dropdown" href="#"> 
     Facets 
     <span class="caret"></span> 
    </a> 
    <ul class="dropdown-menu"> 
     <!-- ko foreach: facets --> 
     <li> 
      <input type="checkbox" data-bind="checked: Visible" /> 
      <span data-bind="text: Name"></span> 
     </li> 
     <!-- /ko --> 
    </ul> 
</div> 

一切都很好,除了我希望下拉對話在檢查複選框時保持打開狀態。

下面是一個例子的小提琴:http://jsfiddle.net/MikeEast/L3KfG/2/

我曾嘗試創建它使用的檢查與event.preventDefault()event.stopPropagation()留下打開對話明確地綁定在一起我自己綁定的處理程序,但禁止進行檢查的複選框。

任何指針?

回答

42

這聽起來像你在正確的軌道上。基本上,你想要做的相當於:

click: function() { return true; }, clickBubble: false 

OR這在自定義可以做樣結合:由KO連接

ko.bindingHandlers.stopBubble = { 
    init: function(element) { 
    ko.utils.registerEventHandler(element, "click", function(event) { 
     event.cancelBubble = true; 
     if (event.stopPropagation) { 
      event.stopPropagation(); 
     } 
    }); 
    } 
}; 

正常點擊/事件處理程序將阻止默認動作除非你回覆真實。然而,如果我們連接我們自己的事件處理程序,那麼我們只需要防止它冒泡。

樣品:http://jsfiddle.net/MikeEast/PyNfg/1/

+0

不錯!聰明地捕捉父母元素中的冒泡!謝謝!順便說一句:我編輯:'event.cancelBubble;' - >'event.cancelBubble = true;' –

+2

oops,是的應該是'true'。接得好。 –

+0

我怎麼能超過一次upvote答案,你救了我的生命。 –