2012-06-29 32 views
5

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

这个问题的再现可以在这里找到http://jsfiddle.net/rhoadsce/VSWK2/在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> 
+3

+1:代码,小提琴,明显企图对自己的成功,而一个有趣的问题。优秀的第一个问题,欢迎来到Stack Overflow – Tyrsius

回答

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

+0

谢谢!那就是诀窍。 – rhoadsce