Опасаясь, что это ошибка, надеюсь, что это только я:
Я использую шаблон jquery.tmpl в привязке данных knockout.js.Шаблон использует нотацию jquery.tmpl для привязки к свойствам: ${Name}
.Оказывается, что когда свойство «Имя» имеет значение null
, шаблон отображает 4-буквенную строку "null"
в HTML.Это неудобно.( Примечание: В данном случае имя является ko.observable).
Если я использую шаблон вручную, $("#rowTemplate").tmpl(item).appendTo($("tbody"))
и Name
- это , а не , которое можно наблюдатьШаблон jQuery отображает пустую строку.Это гораздо больше похоже на поведение, которое я ожидаю.
Рисуем все это на шаг дальше, если я сделаю нулевую проверку в шаблоне, используя:
{{if Name != null}}
<input value="${Name}" />
{{/if}}
Затем обычныйШаблон jQuery не отображает поле ввода.Однако при использовании шаблона с knockout.js условие Name != null
является ложным, поскольку 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>