Модуль 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.