Доступ к данным в шаблонах

В библиотеке Choices.js система шаблонов строится вокруг объектов данных, которые передаются в функции генерации DOM-структур. Каждый элемент списка выбора и каждый выбранный элемент представлен унифицированной структурой, содержащей набор стандартных полей и, при необходимости, пользовательские расширения.

Базовый объект, доступный в шаблонах, обычно включает следующие свойства:

  • value — фактическое значение элемента, используемое при отправке формы
  • label — отображаемый текст
  • id — внутренний идентификатор элемента
  • selected — состояние выбора
  • active — активное состояние в списке
  • disabled — признак недоступности
  • customProperties — произвольный объект с дополнительными данными

Именно через эти поля осуществляется доступ к информации внутри шаблонов, что позволяет формировать сложные интерфейсы без вмешательства в внутреннюю логику компонента.


Доступ к данным внутри callbackOnCreateTemplates

Основной механизм переопределения шаблонов в Choices.js реализуется через функцию callbackOnCreateTemplates. Она возвращает объект с функциями-шаблонами, каждая из которых получает данные элемента и набор служебных классов.

Типичная сигнатура выглядит следующим образом:

  • itemTemplate(data, escapeFn)
  • choiceTemplate(data, escapeFn)
  • groupTemplate(data)

Ключевым параметром является data, который содержит описанную выше структуру элемента. Через него осуществляется полный доступ ко всем значениям, связанным с конкретной сущностью списка.


Использование value и label в шаблонах

Наиболее часто используемые поля — value и label. Они образуют базовую пару данных: значение и отображение.

В шаблонах доступ к ним осуществляется напрямую:

  • data.value — для атрибутов value или логики обработки
  • data.label — для визуального текста

В случае кастомных отображений label может быть обёрнут в HTML-структуру, дополнен иконками или дополнительными метками, при этом value остаётся неизменным идентификатором, используемым внутри формы.


Работа с customProperties

Поле customProperties является ключевым механизмом расширения данных внутри Choices.js. Оно позволяет передавать произвольные структуры, не ограниченные стандартной схемой.

Примеры типичных сценариев использования:

  • хранение категории элемента
  • добавление цветовых меток
  • передача URL изображений
  • хранение метаданных для фильтрации

Доступ осуществляется напрямую через объект:

  • data.customProperties

Такой подход позволяет создавать сложные шаблоны, где визуальное представление зависит от дополнительных параметров, а не только от label.


Доступ к данным в choiceTemplate

Шаблон choiceTemplate отвечает за элементы выпадающего списка. В этом контексте объект data содержит полную информацию о варианте выбора, включая его состояние.

Особое значение имеют поля:

  • data.active — элемент в текущем фокусе навигации
  • data.disabled — недоступность выбора
  • data.selected — уже выбранные элементы

Эти свойства позволяют формировать динамическую разметку, например:

  • выделение активного пункта
  • скрытие или затемнение недоступных значений
  • визуальное различие выбранных элементов прямо в списке

Доступ к данным в itemTemplate

Шаблон itemTemplate управляет отображением уже выбранных элементов. Здесь структура данных аналогична, однако поведение акцентируется на состоянии выбора.

Основные точки доступа:

  • data.value — идентификатор для удаления или обработки
  • data.label — отображаемое значение внутри выбранного элемента
  • data.customProperties — дополнительные визуальные элементы

В этом шаблоне часто используется логика отображения дополнительных кнопок, индикаторов или визуальных маркеров, основанных на данных объекта.


Работа с группами через groupTemplate

Если данные организованы в группы, Choices.js передаёт в groupTemplate объект, описывающий контейнер элементов.

Типичные поля:

  • data.label — название группы
  • data.disabled — блокировка всей группы
  • data.children — массив вложенных элементов

Доступ к children позволяет формировать кастомные структуры списков, включая свёртки, визуальные разделители или вложенные блоки.


Использование escape-функций при работе с данными

В шаблонах часто передаётся функция экранирования, используемая для безопасного вывода строковых значений.

Она применяется к данным:

  • escapeFn(data.label)
  • escapeFn(data.value)

Это предотвращает вставку потенциально опасного HTML-кода в интерфейс и обеспечивает корректное отображение текста.

При работе с customProperties экранирование также может применяться выборочно, в зависимости от того, содержит ли поле HTML-разметку или чистый текст.


Динамическая логика на основе данных шаблона

Доступ к объекту data внутри шаблонов позволяет строить условные конструкции, полностью определяющие внешний вид элемента.

На основе данных можно:

  • изменять структуру DOM в зависимости от состояния selected
  • добавлять дополнительные элементы интерфейса при наличии customProperties
  • скрывать или изменять элементы при disabled
  • визуально разделять категории через group metadata

Таким образом шаблоны становятся не просто функциями отображения, а полноценным уровнем представления данных.


Особенности доступа к данным в разных режимах отображения

Choices.js использует одни и те же данные, но по-разному интерпретирует их в зависимости от контекста:

  • выпадающий список (choice) использует полный набор состояний активности
  • выбранные элементы (item) фокусируются на value и label
  • группы (group) работают с иерархией children

Несмотря на различие представлений, объект данных сохраняет единый формат, что обеспечивает консистентность доступа внутри всех шаблонов.


Интеграция пользовательских структур данных

При инициализации Choices.js можно передавать массив объектов, содержащих дополнительные поля. Эти поля автоматически сохраняются и становятся доступны через data без необходимости их преобразования.

Пример логики доступа:

  • расширенные атрибуты хранятся в customProperties
  • стандартные поля используются для внутренней логики
  • шаблоны извлекают нужные данные напрямую без промежуточных преобразований

Это позволяет строить сложные UI-компоненты, где источник данных полностью управляет визуальным представлением через шаблоны.