Модуль basis.template
обеспечивает работу с шаблонами, разбор их исходного кода, построение декларации.
Основной класс модуля basis.template.Template
. Этот класс реализует основу для создания и разрушения экземпляров шаблона.
Реализация шаблонов базируется на модели DOM
, в то время, как большинство шаблонизаторов генерируют HTML
и преобразуют его в DOM
, используя innerHTML
. Такой подход дает возможность точечного обновления и делает шаблоны быстрыми и эффективными.
В шаблонах basis.js
нет ветвлений, циклов и вычислений, что делает их простыми и наглядными. Шаблоны описываются в формате HTML
, с некоторыми дополнениями (см Формат шаблонов).
basis.template
также поддерживает темы – наборы шаблонов, которые применяются единовременно.
Несмотря на то, что класс basis.template.Template
реализует основной интерфейс, свойственный шаблонам, его экземпляры не могут создавать экземпляры шаблона. Для этой цели используется его потомок – класс basis.template.html.Template
. Потомки этого класса могут создавать экземпляры шаблона для браузерного DOM
.
Такое разделение является следствием того, что модуль
basis.template
используется при сборке, и должен работать в окружении, где недоступен браузерныйDOM
.
Экземплярам basis.template.Template
при создании задается некоторое описание, или источник (source), на основе которого будут создаваться экземпляры шаблона.
var Template = basis.require('basis.template.html').Template;
var template = new Template('<h1>hello world</h1>');
В качестве источника могут выступать:
-
функция – описанием становится результат выполнения этой функции;
-
строка – используется как описание;
-
объект, поддерживающий интерфейс
binding bridge
– в качестве описания используется значение, полученное в результате вызова методаbindingBridge.get(..)
, и шаблон подписывается на изменение значения; такими значениями, в большинстве случаев, выступают ресурсы и экземплярыbasis.template.SourceWrapper
; -
массив или объект содержащий токены – не используются в разработке, используется в сборке (в сборке шаблоны хранятся в оптимизированном виде);
-
все другие значения приводятся к строке, которая используется как описание.
Экземпляры basis.template.Template
поддерживают авторасширение, поэтому при создании классов и экземпляров, где шаблон представлен свойством, достаточно передавать описание, шаблон будет создан неявно (подробнее).
var Node = basis.require('basis.ui').Node;
var Foo = Node.subclass({
template: '<h1>hello world</h1>' // это эквивалентно new basis.template.html.Template('<h1>hello world</h1>')
});
var node = new Node({
template: basis.resource('./path/to/template.tmpl')
});
Описание может быть изменено в любой момент методом setSource
, либо оно может поменяться в следствие изменения значения источника (объекта с интерфейсом binding bridge
). В этом случае уже созданные экземпляры шаблона будут пересозданы по новому описанию. Эта возможность дает большую гибкость и лежит в основе механизма динамического обновления (live update), позволяя перестраивать интерфейс без перезагрузки страницы.
Шаблоны используются только в рамках экземпляров классов basis.ui.Node
, basis.ui.PartitionNode
и их потомков. Экземпляры этих классов делают всю работу по созданию экземпляров шаблона и синхронизации состояния и данных с ними. Таким образом, основная часть работы с шаблонами сводится к описанию шаблонов, предоставление им значений через binding
и описание реакции на события через action
.