2012-12-18 17 views
8

を持つ要素のためにバブリング防ぐことが<event>のために(注参照)a defined event handlerがあるときのみ動作結合<event>Bubble: falseのように思えます。knockoutjs:イベントはありませんハンドラ

fiddleの例を示します。特定のイベントのためのネイティブハンドラを有する要素については

(例えばクリック:<textarea><a><select>など)のネイティブハンドラで十分で、私は結合、例えば、それらの上にclickBubble: false、なくてもバインドする設定を期待します"偽の"ハンドラを動作させる。

私の質問は、余分なバインディングなしにこれを達成するためのもう1つのノックアウト方法はありますか?

答えて

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クラスの偽のハンドラよりも再利用可能だと思います。私はあなたの答えを+1しました。他の解決策のために、1日かそれ以上の時間をおしゃべりするだけです。私は最もエレガントで有用な、正直なエンジンを選択することを忘れないでしょう。 – Steven

関連する問題