Knockout.js предоставляет мощные механизмы для связывания данных с
интерфейсом через декларативные привязки. Одной из наиболее гибких
возможностей является использование привязки template,
которая позволяет строить динамические и повторно используемые шаблоны
элементов.
templateПривязка template используется для отображения
содержимого на основе шаблона, который может быть как встроенным в HTML,
так и загруженным динамически. Она поддерживает различные источники
данных, условия отображения и повторение элементов.
Синтаксис базовой привязки:
<div data-bind="template: { name: 'myTemplate', data: myData }"></div>
<script type="text/html" id="myTemplate">
<p data-bind="text: name"></p>
</script>
name — идентификатор HTML-шаблона или имя
зарегистрированного шаблона.data — объект или observable, передаваемый в шаблон для
привязки.if или foreach внутри
привязки для управления отображением элементов.Динамический шаблон позволяет выбирать шаблон во время выполнения на основе данных или состояния модели. Это особенно полезно для рендеринга различных представлений одного объекта.
<div data-bind="template: { name: templateToUse, data: currentItem }"></div>
var viewModel = {
currentItem: ko.observable({ type: 'text', value: 'Пример' }),
templateToUse: ko.computed(function() {
switch (viewModel.currentItem().type) {
case 'text': return 'textTemplate';
case 'image': return 'imageTemplate';
default: return 'defaultTemplate';
}
})
};
ko.applyBindings(viewModel);
В этом примере выбор шаблона происходит динамически с помощью
вычисляемого observable templateToUse. Это позволяет
создавать универсальные компоненты, которые адаптируются к различным
типам данных.
foreach с шаблонамиПривязка template тесно интегрируется с
foreach, что позволяет эффективно работать с массивами
данных.
<div data-bind="template: { name: 'itemTemplate', foreach: items }"></div>
<script type="text/html" id="itemTemplate">
<li data-bind="text: name"></li>
</script>
Каждый элемент массива items будет отрисован с
использованием указанного шаблона. При этом Knockout автоматически
управляет добавлением и удалением элементов при изменении массива.
Шаблоны могут получать параметры и изменять контекст данных с помощью
as или вложенных привязок.
<div data-bind="template: { name: 'userTemplate', data: user, as: 'u' }"></div>
<script type="text/html" id="userTemplate">
<p data-bind="text: u.firstName"></p>
<p data-bind="text: u.lastName"></p>
</script>
Использование ключевого слова as позволяет задавать
локальное имя для текущего контекста, что улучшает читаемость и
предотвращает конфликт имён в сложных шаблонах.
Привязка template поддерживает условное отображение
через if и ifnot.
<div data-bind="template: { name: 'specialTemplate', if: isSpecial }"></div>
if — шаблон будет отрисован только если выражение
истинно.ifnot — шаблон отрисован, когда выражение ложно.Такая конструкция позволяет динамически изменять интерфейс без необходимости вручную управлять DOM.
Knockout позволяет создавать вложенные шаблоны для комплексных интерфейсов.
<script type="text/html" id="parentTemplate">
<h2 data-bind="text: title"></h2>
<div data-bind="template: { name: 'childTemplate', foreach: items }"></div>
</script>
<script type="text/html" id="childTemplate">
<p data-bind="text: name"></p>
</script>
Вложенные шаблоны повышают модульность кода и позволяют разделять интерфейс на независимые компоненты, что облегчает сопровождение и тестирование.
Knockout поддерживает загрузку шаблонов с сервера с помощью сторонних
библиотек (например, RequireJS) или через механизм
ko.templateEngine. Это позволяет хранить большие шаблоны
отдельно от HTML и подгружать их по необходимости.
var engine = new ko.nativeTemplateEngine();
engine.addTemplate('remoteTemplate', '<p data-bind="text: name"></p>');
ko.applyBindings(viewModel, document.getElementById('container'));
Привязка template является ядром динамического
рендеринга в Knockout.js. Она сочетает в себе поддержку вложенных и
повторяющихся структур, динамический выбор шаблонов, условное
отображение и интеграцию с массивами данных. Использование шаблонов
повышает модульность кода, улучшает читаемость и позволяет создавать
сложные интерфейсы с минимальными усилиями по управлению DOM.