2012-01-25 2 views
6

Привет Я пытаюсь установить ko так, чтобы на любом обработчике клика было написано немного пользовательского кода. Самый простой способ добавить некоторый пре-и почтовый код в обработчик привязки «щелчок»?knockoutjs overriding bindinghandlers

ответ

16

Вы можете создать пользовательские привязки, который оборачивает click связывания или сохранить от ссылок на оригинальные init и update функций click связывания и заменить реальный.

Вы можете либо выполнить какой-либо код в функции update, которая будет активирована при обновлении значения модели (либо обработчиком события, подключенным в функции init, либо программно), либо выполнить код как часть фактического обработчика , Это звучит так, как будто вы хотите последнего.

Вашего связывания может выглядеть следующим образом:

(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); 
     } 
    }; 
})(); 

Я отщепляюсь предварительно/почтовый индекс, например, что во время выполнения вы можете переопределить ko.bindingHandlers.click.preOnClick или ko.bindingHandlers.click.postOnClick

Вот пример: http://jsfiddle.net/rniemeyer/PksAn/

Если вам нужно запустить собственный код в функции обновления, вы можете разделить его и запустить свой предварительный и почтовый код и выполнить originalUpdate между ними.

+0

спасибо RP. это имеет большой смысл. – Chin

+0

RP, вы можете проверить это? Мне нужен поставщик обязательного связывания, http://stackoverflow.com/questions/14535102/binding-jagged-array-with-knockout – user960567

+0

Это должен быть принятый ответ, правильный код и правильное решение. –