Методы управления состоянием

В основе Choices.js лежит модель состояния, разделённая на несколько логических слоёв: список доступных опций, выбранные значения, активные (highlighted) элементы, а также внутреннее представление пользовательского ввода. Эта структура позволяет библиотеке поддерживать как одиночный, так и множественный выбор, обеспечивать поиск, фильтрацию и динамическое изменение данных без прямого вмешательства в DOM.

Состояние не хранится исключительно в DOM-структуре. Вместо этого используется внутренний store, синхронизируемый с визуальным представлением. Это делает возможным программное управление компонентом через API-методы без необходимости ручного обновления интерфейса.


Инициализация и внутренние структуры состояния

При создании экземпляра Choices формируется несколько ключевых коллекций:

  • choices — полный список доступных элементов (options)
  • items — выбранные элементы (selected items)
  • highlighted — элементы, находящиеся в фокусе или подсвеченные при навигации
  • search results — временный набор элементов, отфильтрованных по вводу

Каждый элемент в этих коллекциях представляет собой объект с унифицированной структурой:

  • value — значение
  • label — отображаемый текст
  • selected — состояние выбора
  • disabled — блокировка элемента

Эта модель позволяет унифицировать операции независимо от источника данных: HTML-разметка, массив объектов или асинхронная подгрузка.


Методы чтения состояния

getValue()

Метод getValue() возвращает текущее состояние выбранных элементов.

  • Без аргументов возвращается массив объектов выбранных значений
  • При передаче true возвращается только массив значений (value)
  • При множественном выборе результат всегда массив
  • При одиночном выборе возвращается либо объект, либо значение в зависимости от конфигурации

Особенность реализации заключается в том, что метод читает данные из внутреннего store, а не из DOM, что исключает рассинхронизацию состояния при сложных операциях.


getValue(true) — упрощённое представление

При использовании булевого параметра происходит трансформация структуры:

  • исходные объекты фильтруются
  • извлекаются только поля value
  • возвращается примитивный массив

Это полезно при интеграции с API, где требуется только идентификатор выбора без метаданных.


Методы изменения выбранных значений

setChoiceByValue()

Метод используется для программного выбора элементов по их значению.

Алгоритм работы:

  1. Происходит поиск совпадения в списке choices
  2. Если элемент найден и не отключён, он добавляется в items
  3. Состояние обновляется, вызываются внутренние события изменения

Особенность заключается в том, что метод не добавляет новые опции — он работает только с уже существующими значениями.


addItem()

addItem() является одним из ключевых методов управления состоянием.

Он выполняет:

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

Сигнатура метода обычно включает:

  • value
  • label (опционально)
  • дополнительные параметры конфигурации

При включённой опции addItems библиотека может автоматически расширять список доступных значений.


removeItem()

Метод отвечает за удаление выбранного элемента.

Процесс включает:

  • поиск элемента в items
  • удаление из внутреннего массива выбранных значений
  • возврат элемента в пул доступных опций (если применимо)
  • обновление UI

Удаление происходит по значению, что обеспечивает предсказуемость поведения даже при одинаковых label.


Управление списком опций

setChoices()

Метод setChoices() используется для полной или частичной замены списка доступных элементов.

Режимы работы:

  • полная замена — старые данные очищаются, новые загружаются
  • добавление — новые элементы добавляются к существующим

Каждый элемент массива должен соответствовать структуре:

  • value
  • label
  • selected
  • disabled

При выполнении метода происходит:

  • пересборка внутреннего store
  • обновление DOM-списка
  • пересчёт фильтров поиска

Метод активно используется при работе с динамическими источниками данных, например API или зависимыми селектами.


clearStore()

Метод очищает все внутренние коллекции:

  • choices
  • items
  • highlighted

После выполнения состояние компонента возвращается к пустому виду. DOM также синхронизируется и очищается.

Использование метода характерно для сценариев полной переинициализации компонента без уничтожения экземпляра.


Сброс и очистка состояния

clearInput()

Метод отвечает за очистку пользовательского ввода в поле поиска.

Действия:

  • обнуление строки поиска
  • сброс фильтрации
  • восстановление полного списка choices
  • обновление отображения dropdown

Состояние выбора при этом не затрагивается, изменяется только поисковый слой.


reset()

Метод reset() возвращает компонент к начальному состоянию.

Выполняется:

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

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


Отключение и включение компонента

disable()

Метод переводит компонент в неактивное состояние.

Поведение:

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

Состояние store остаётся неизменным, что позволяет восстановить работу без потери данных.


enable()

Обратная операция к disable().

Выполняется:

  • активация input
  • восстановление взаимодействия с UI
  • включение обработки событий

Метод не изменяет данные, а только управляет интерактивностью.


Синхронизация состояния и событийной модели

Choices.js тесно связывает управление состоянием с системой событий. Любое изменение store приводит к генерации событий:

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

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

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


Модификация состояния через комбинированные операции

В реальных сценариях методы состояния часто комбинируются:

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

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