我创建了一个knockoutjs插件,最终在"更新"中使用了ko.renderTemplate。它的一部分绑定处理程序。代码产生预期的输出,但也抛出一个"无法解析绑定"错误。
可以在jsfiddle上找到此问题的复制品http://jsfiddle.net/rhoadsce/VSWK2/。
javascript如下:
ko.plugin = function(configuration) {
var self = this;
self.content = configuration.content || '';
};
ko.bindingHandlers.plugin = {
update: function(element, valueAccessor, allBindingsAccessor) {
var viewModel = valueAccessor();
$(element).append('<div id="pluginContainer"></div>');
var $container = $(element).children('#pluginContainer');
ko.renderTemplate("pluginTemplate", viewModel, {}, $container, 'replaceNode');
}
};
$(function () {
var vm = (function() {
var plugin = new ko.plugin({ content: 'test content'});
return {
plugin: plugin
}
})();
ko.applyBindings(vm);
});
html同样简单。
<div data-bind="plugin: plugin"></div>
<script id="pluginTemplate" type="text/html"><span data-bind="text: content"></span></script>
答案 0 :(得分:4)
我认为问题在于KO正在尝试为div的后代应用绑定(并且它使用根视图模型作为上下文,而不是内部插件VM),但是已经调用了ko.renderTemplate
本身将绑定应用于后代(具有正确的上下文)。
为防止这种情况,请使bindingHandler的init方法返回{ controlsDescendantBindings: true }
。这可以防止KO尝试应用绑定。 Here's the updated fiddle
有关其他信息,请参阅此处:http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html