【发布时间】:2011-11-18 13:38:09
【问题描述】:
担心这是一个错误,希望只是我自己:
我在 knockout.js 数据绑定中使用 jquery.tmpl 模板。该模板使用 jquery.tmpl 表示法绑定到属性:${Name}。事实证明,当 'Name' 属性为 null 时,模板会将 4 个字母的字符串 "null" 渲染到 HTML 中。这很尴尬。 (注意:在这种情况下,名称是 ko.observable)。
如果我手动使用模板 $("#rowTemplate").tmpl(item).appendTo($("tbody")) 和 Name 是 not 一个可观察的然后 jQuery 模板呈现一个空字符串。这更像是我所期望的行为。
如果我使用以下方法在模板中进行空检查,则将整个内容进一步绘制:
{{if Name != null}}
<input value="${Name}" />
{{/if}}
那么普通的 jQuery 模板不会渲染输入框。但是,当使用带有 knockout.js 的模板时,条件 Name != null 为 false,因为 Name 是可观察的。另一方面,{{if Name() != null}} 是无效的 jQuery 模板语法。
我没有找到解决此问题的任何方法。谁能告诉我如何正确使用 jQuery 模板和 knockout.js?还是我必须向淘汰项目报告错误?
示例 HTML 文档:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test Page</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<script type="text/javascript" src="jquery.tmpl.min.js"></script>
<script type="text/javascript" src="knockout-1.3.0beta.js"></script>
<script type="text/javascript" src="knockout.mapping-latest.js"></script>
</head>
<body>
<table>
<thead><tr><th>Name</th></tr></thead>
<tbody data-bind="template: { name: 'rowTemplate', foreach: items }"> </tbody>
</table>
<script id="rowTemplate" type="text/x-jquery-tmpl">
{{if Name != null}}
<tr><td>${Name}</td></tr>
{{/if}}
</script>
<script type="text/javascript">
var rawItems = [{ "Name": null }, { "Name": "Me"}];
var boundData = {
items: ko.mapping.fromJS(rawItems)
};
$(document).ready(function () {
// Knockout way:
ko.applyBindings(ko.mapping.fromJS({ items: rawItems }));
// Non-knockout way:
//$.each(rawItems, function () {
// $("#rowTemplate").tmpl(this).appendTo($("tbody"));
//});
});
</script>
</body>
</html>
【问题讨论】:
标签: knockout.js jquery-templates