解决方法
您可以创建包装单击绑定的自定义绑定,也可以保存对原始init的引用,并更新单击绑定的更新功能并替换实际绑定.
您可以选择在更新函数中执行某些代码,这些代码将在更新模型值时触发(通过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,event); //run some post code ko.bindingHandlers.click.postOnClick.call(viewmodel,event); }; }; originalInit(element,wrappedValueAccessor,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