我创建了一个 knockout 插件,最终在其绑定(bind)处理程序的“更新”部分中使用ko.renderTemplate。该代码产生预期的输出,但还会引发“无法解析绑定(bind)”错误。

您可以在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>

最佳答案

我认为问题在于KO正在尝试为div的后代应用绑定(bind)(并且使用根viewmodel作为上下文而不是内部插件VM来执行此操作),但是对ko.renderTemplate本身的调用已经将绑定(bind)应用于后代(带有正确的上下文)。

为了防止这种情况,请使bindingHandler的init方法返回{ controlsDescendantBindings: true }。这样可以防止KO尝试应用绑定(bind)。 Here's the updated fiddle

有关其他信息,请参见此处:http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html

关于knockout.js - 使用ko.renderTemplate在插件中 knockout "Unable to parse bindings",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11268863/

10-09 22:41