2012-01-25 16 views
6

こんにちは私は少しのカスタムコードと呼ばれる任意のクリックハンドラー上で実行されるようにkoを設定しようとしています。 「クリック」バインディングハンドラに前後のコードを追加する最も簡単な方法は何ですか?knockoutjs bindinghandlersをオーバーライド

答えて

16

あなたはどちらかの結合clickをラップしているカスタムバインディングを作成したり、結合clickの元initupdate機能への参照をオフに保存して、本物の1を置き換えることができます。

update関数で、モデル値が更新されたとき(init関数に付属するイベントハンドラまたはプログラムによってプログラムによって)にトリガされるコードを実行するか、実際のハンドラの一部としてコードを実行するかを選択できます。あなたが後者を望むように私に聞こえる。

あなたの結合は、次のようになります。私は、実行時にあなたがここko.bindingHandlers.click.preOnClickまたはko.bindingHandlers.click.postOnClick

をオーバーライドすることができることを、このようなプリ/ポストコードを分割

(function() { 
    var originalInit = ko.bindingHandlers.click.init, 
     originalUpdate = ko.bindingHandlers.click.update; 

    ko.bindingHandlers.click = { 
     init: function(element, valueAccessor, allBindingsAccessor, viewModel, context) { 
      var wrappedValueAccessor = function() { 
       return function(data, event) { 
        //run some pre code 
        ko.bindingHandlers.click.preOnClick.call(viewModel, data, event); 

        valueAccessor().call(viewModel, data, event); 

        //run some post code 
        ko.bindingHandlers.click.postOnClick.call(viewModel, data, event); 
       }; 

      }; 

      originalInit(element, wrappedValueAccessor, allBindingsAccessor, viewModel, context); 
     }, 
     update: originalUpdate, 
     preOnClick: function(data, event) { 
      alert("pre code for " + data.id); 
     }, 
     postOnClick: function(data, event) { 
      alert("post code for " + data.id); 
     } 
    }; 
})(); 

はサンプルです:http://jsfiddle.net/rniemeyer/PksAn/

更新機能でカスタムコードを実行する必要がある場合は、分割して前後のコードを実行し、その間にoriginalUpdateを実行します。

+0

ありがとうございます。それはたくさんの意味があります。 – Chin

+0

RP、これをチェックしてもらえますか?カスタムバインディングプロバイダが必要です。http://stackoverflow.com/questions/14535102/binding-jagged-array-with-knockout – user960567

+0

これは受け入れられる回答である必要があります。コードは正しいものであり、解決策は適切です。 –