【发布时间】:2012-10-31 20:51:13
【问题描述】:
我在使用带有自定义模板绑定的 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 是模板。
那么如何在我的自定义模板活页夹中将其标记为模板?
谢谢。
【问题讨论】:
-
需要返回模板绑定
init函数的值。它返回一个名为controlsDescendantBindings的标志,它告诉KO 你将处理绑定它的孩子。否则,它将继续尝试将子元素与当前数据上下文绑定。
标签: templates knockout.js