Javascript 升级到Knockout 3.0.0,模板/自定义绑定处理程序不再工作
将我的代码库升级到Knockout 3.0.0时,以下代码不再有效。有人能提供一个解决办法吗 引用模板的代码:Javascript 升级到Knockout 3.0.0,模板/自定义绑定处理程序不再工作,javascript,Javascript,将我的代码库升级到Knockout 3.0.0时,以下代码不再有效。有人能提供一个解决办法吗 引用模板的代码: <div data-bind="clientFormItemTemplate: {foreach: clients}"/> ko.bindingHandlers.clientFormItemTemplate = { init: function(element, valueAccessor, allBindingsAccessor, viewModel, cont
<div data-bind="clientFormItemTemplate: {foreach: clients}"/>
ko.bindingHandlers.clientFormItemTemplate = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, context)
{
return ko.bindingHandlers.template.init.apply (this, arguments);
},
update: function(element, valueAccessor, allBindingsAccessor, viewModel, context)
{
return (ko.bindingHandlers.template.update.apply (this, arguments));
}
}
我认为您缺少
模板
绑定的名称
属性。您可以将其添加到自定义绑定中,如下所示:
ko.bindingHandlers.clientFormItemTemplate = (function() {
function getModifiedValue(valueAccessor) {
return function() {
var value = valueAccessor();
value.name = 'clientFormItemTemplate';
return value;
};
}
return {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, context) {
return ko.bindingHandlers.template.init(element, getModifiedValue(valueAccessor), allBindingsAccessor, viewModel, context);
},
update: function(element, valueAccessor, allBindingsAccessor, viewModel, context) {
return ko.bindingHandlers.template.update(element, getModifiedValue(valueAccessor), allBindingsAccessor, viewModel, context);
}
};
})();
这是一个工作表(使用Knockout 3.0.0)。您为什么不使用默认的
模板
绑定?我能想到的一个原因(如果这不是全部代码)可能是“2.绑定现在独立刷新”(从)我没有使用默认模板绑定,因为我正在迁移Flex应用程序并试图模仿Flex创建自定义组件的能力。我的自定义绑定处理程序代码还包括我在afterRender事件中附加的用于单击和双击的处理程序(它们未显示在代码段中)。在问我的问题之前,我查看了升级说明,注意到关于绑定的部分独立刷新,但我无法建立连接,因为我只有一个绑定(即foreach绑定)。好的,明白了。我注意到另一件事。template
绑定除了使用foreach
之外,还使用一个name
参数来标识它应该使用的模板。可能需要将此属性添加到自定义绑定中的valueAccessor()
。但是,如果相同的代码已经工作,那么这里就不会有问题。
ko.bindingHandlers.clientFormItemTemplate = (function() {
function getModifiedValue(valueAccessor) {
return function() {
var value = valueAccessor();
value.name = 'clientFormItemTemplate';
return value;
};
}
return {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, context) {
return ko.bindingHandlers.template.init(element, getModifiedValue(valueAccessor), allBindingsAccessor, viewModel, context);
},
update: function(element, valueAccessor, allBindingsAccessor, viewModel, context) {
return ko.bindingHandlers.template.update(element, getModifiedValue(valueAccessor), allBindingsAccessor, viewModel, context);
}
};
})();