我有一个问题,使用自定义模板绑定knockoutjs。knockoutjs - 自定义模板绑定父级内容
假设我有一个HTML的身体是这样的:
<div id="1">
<div data-bind="template:{name: '2', data: data}"></div>
</div>
<div id="2">
<h3 data-bind="text: caption"></h3>
</div>
JS代码如下所示:
var ViewModel2 = function() {
this.caption = ko.observable("Caption");
}
var ViewModel1 = function() {
this.data = new ViewModel2();
}
ko.applyBindings(new ViewModel1(), document.getElementById("1"));
如果我们测试此代码,一切都将工作得很好;
请参阅JSFiddle示例:http://jsfiddle.net/4eTWW/33/
现在假设我们想使自定义模板绑定。我们将使用'templatex'绑定而不是'template'。
在HTML我们需要改变的只是一条线:
<div data-bind="templatex:{name: '2', data: data}"></div>
接下来,让我们添加自定义模板结合JS:
/*Custom binding*/
ko.bindingHandlers.templatex = {
init: function (element) {
ko.bindingHandlers.template.init.apply(this, arguments);
},
update: ko.bindingHandlers.template.update
}
参见:http://jsfiddle.net/4eTWW/35/
但是,在这种情况下,我们有一个错误,说它无法在模型中找到'标题'。
现在让我们添加模板{}为HTML绑定:
<div data-bind="template: {}, templatex:{name: '2', data: data}"></div>
参见:http://jsfiddle.net/4eTWW/36/
而现在一切都运行得很好。
看来,虽然绑定父div它不能确定子div是模板。
那么如何将其标记为我的自定义模板联编程序中的模板?
谢谢。
你需要retu模板绑定'init'函数的值。它返回一个名为'controlsDescendantBindings'的标志,告诉KO你将处理绑定其子项。否则,它将继续尝试将子元素与当前数据上下文绑定。 –