5

バインディング ハンドラーの「更新」部分で最終的に ko.renderTemplate を使用するノックアウト js プラグインを作成しました。コードは予想される出力を生成しますが、「バインドを解析できません」というエラーもスローします。

この問題の再現は、http: //jsfiddle.net/rhoadsce/VSWK2/ on jsfiddle にあります。

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>
4

1 に答える 1

4

問題は、KO が div の子孫にバインディングを適用しようとしている (そして、内部プラグイン VM ではなく、コンテキストとしてルート ビューモデルを使用してこれを行う) ことだと思いますが、ko.renderTemplateそれ自体への呼び出しは既に子孫にバインディングを適用しています (正しい文脈)。

これを防ぐには、bindingHandler の init メソッドを return にし{ controlsDescendantBindings: true }ます。これにより、KO がバインドを適用しようとするのを防ぎます。これが更新された fiddleです。

追加情報については、こちらを参照してください: http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html

于 2012-07-01T02:35:43.167 に答える