Содержание

<b:define>

Этот тег используется для определения возможных значений биндинга. На данный момент это влияет только на биндинги, используемые в атрибуте class.

Когда биндинг используется в атрибуте class, необходимо знать, какие значения он может принимать, для того чтобы:

  • образовывать правильные классы;

  • обнаруживать конфликты, когда одинаковые имена классов могут быть образованы разными биндингами, что может привести к ошибкам;

    На данных момент такая проверка не делается, но она должна быть добавлена.

  • находить соответствия между классами в шаблонах и стилях, чтобы находить ненужные классы в шаблонах (для которых нет в стилях) и ненужные CSS правила (которые не используются шаблонами);

    Этим занимается модуль сборщика extractor. Эту информацию получает в виде предупреждающих сообщений плагин. С помощью флага --css-cut-unused сборщику можно указать, чтобы он вырезал неиспользуемые в CSS правила. Но рекомендуется это делать самостоятельно, на основе получаемых предупреждений.

  • минизировать имена классов в сборке.

    Если все имена определены, для сборщика можно указать флаг --css-optimize-names, и тогда он минимизирует имена классов в шаблонах и CSS до одно-/двух-буквенных, тем самым уменьшая размер сборки.

Тег имеет атрибуты:

  • name – имя биндинга, для которого описывается правило;

  • type – тип устанавлеваемый для биндинга, может быть два значения:

    • bool – значение приводится к boolean, если значение тождественно true, то значением становится имя биндига и класс вставляется, иначе класс не вставляется;

    • invert - противоположен типу bool. Значение приводится к boolean, если значение тождественно false, то значением становится имя биндига и класс вставляется, иначе класс не вставляется;

    • enum – значение должно быть равно одному из списка (сравнивается оператором ==, регистрозависимо), то это значение становится классом и вставляется, иначе класс не вставляется;

  • values – применимо только к типу enum, содержит список допустимых значений, разделеных пробелом;

  • default – значение по умолчанию:

    • для типа bool – если значение атрибута равно true, то значение по умолчанию true, при других значениях или если атрибут не указан, то значение по умолчанию – false;

    • для типа invert – если значение атрибута равно false, то значение по умолчанию false, при других значениях или если атрибут не указан, то значение по умолчанию – true;

    • для типа enum – если указано значение из списка (values), то оно будет по умолчанию, если значения нет в списке или атрибут не указан – по умолчанию будет пустая строка (класс не будет проставлен в эталон).

  • from – имя существующего биндинга, источник значения для нового биндинга

<b:define name="selected" type="bool"/>
<b:define name="state" type="enum" values="processing ready error"/>
<b:define name="notReady" from="state" type="enum" values="processing"/>
<b:define name="hasName" from="username" type="bool"/>

<div class="item item_{selected} item_{state} {notReady} {hasName}"/>

В данном примере, если значение для selected равноценно true, то будет вставлен класс item_selected, иначе такого класса у элемента не будет. Для state будут приниматься только три значения и образовываться классы item_processing, item_ready и item_error; при других значениях класс добавлен не будет.

Указание default позволяет оптимизировать создание шаблона. Если известно, что некоторый биндинг при создании чаще всего имеет определенное значение, можно изначально проставить класс с этим значением и избежать операции вставки этого класса при создании экземпляра шаблона. Например, практически все экземпляры basis.ui.Node создаются с selected == false и unselected == true. Если в шаблоне используются оба значения, то выгоднее описать шаблон так:

<b:define name="selected" type="bool"/>
<b:define name="unselected" type="bool" default="true"/>

<div class="item item_{selected} item_{unselected}"/>

Тогда эталонный DOM фрагмент, который клонируется при создании экземпляра шаблона, будет таким:

<div class="item item_unselected"/>

И, в данном примере, при создании экземпляра шаблона никаких изменений в склонированом DOM фрагменте не будет.