Именованные шаблоны в Knockout.js представляют собой отдельные блоки разметки, которые можно определять один раз и использовать многократно в разных частях приложения. Основное преимущество именованных шаблонов — возможность изолировать структуру отображения данных от логики представления и повторно применять ее в различных контекстах.
Именованный шаблон задается с помощью тега
<script> с атрибутом type="text/html" и
уникальным идентификатором id:
<script type="text/html" id="person-template">
<div class="person">
<h3 data-bind="text: name"></h3>
<p data-bind="text: age"></p>
</div>
</script>
В этом примере шаблон с id="person-template" определяет
отображение информации о человеке. Атрибуты data-bind
связывают элементы DOM с соответствующими свойствами модели данных.
Для использования именованного шаблона применяется привязка
template:
<div data-bind="template: { name: 'person-template', data: selectedPerson }"></div>
name указывает на идентификатор шаблона.data задает объект модели, который будет использоваться
для привязки данных внутри шаблона.Шаблоны особенно полезны при работе с массивами. Привязка
foreach позволяет динамически создавать повторяющиеся
элементы на основе шаблона:
<div data-bind="template: { name: 'person-template', foreach: people }"></div>
Здесь people — это observableArray, содержащий объекты с
данными о людях. Knockout автоматически создаст блоки DOM для каждого
элемента массива, применяя указанный шаблон.
$data,
$parentПри использовании шаблонов важно понимать контекст данных. Внутри шаблона:
$data — текущий объект модели данных.$parent — родительский объект в иерархии привязок.$root — корневой объект ViewModel.Пример использования $parent:
<script type="text/html" id="task-template">
<div>
<p data-bind="text: title"></p>
<button data-bind="click: $parent.removeTask">Удалить</button>
</div>
</script>
<div data-bind="template: { name: 'task-template', foreach: tasks }"></div>
Каждая задача получает доступ к методу removeTask
родительского объекта.
Knockout позволяет передавать дополнительные параметры с помощью
свойства templateOptions:
<script type="text/html" id="button-template">
<button data-bind="text: label, click: action"></button>
</script>
<div data-bind="template: { name: 'button-template', templateOptions: { label: 'Сохранить', action: saveData } }"></div>
Внутри шаблона можно использовать параметры через $data
или создавать локальные observables.
Шаблоны могут содержать другие шаблоны для построения сложных интерфейсов. Это обеспечивает модульность и повторное использование компонентов:
<script type="text/html" id="comment-template">
<div class="comment">
<strong data-bind="text: author"></strong>
<p data-bind="text: message"></p>
<div data-bind="template: { name: 'comment-template', foreach: replies }"></div>
</div>
</script>
Такой подход позволяет строить древовидные структуры, например, для комментариев с ответами.
Knockout поддерживает динамическую смену шаблонов с помощью функции или observable:
<div data-bind="template: { name: currentTemplate, data: item }"></div>
currentTemplate может изменяться в процессе работы
приложения, что позволяет динамически менять отображение элементов без
изменения логики ViewModel.
Именованные шаблоны являются фундаментальным инструментом Knockout.js для организации модульных, масштабируемых и поддерживаемых интерфейсов.