【发布时间】:2012-01-25 11:45:07
【问题描述】:
您好,我正在尝试设置 ko,以便在调用任何单击处理程序时运行一些自定义代码。 将一些前置和后置代码添加到“点击”绑定处理程序的最简单方法是什么?
【问题讨论】:
标签: knockout.js
您好,我正在尝试设置 ko,以便在调用任何单击处理程序时运行一些自定义代码。 将一些前置和后置代码添加到“点击”绑定处理程序的最简单方法是什么?
【问题讨论】:
标签: knockout.js
您可以创建一个自定义绑定来包装click 绑定,或者保存对click 绑定的原始init 和update 函数的引用并替换真实的。
您可以选择在 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。
【讨论】:
$data.myProp。否则,更宽容的绑定提供者可能是:jsfiddle.net/rniemeyer/ruaLJ
with 或foreach 的绑定无法解析,那么它会尝试绑定孩子,就好像它不存在一样。此外,如果突然填充了未定义的值,它不会做任何事情来“重新绑定”元素。