Содержание

Шаблоны (basis.template)

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