Работа с программной установкой значений в Choices.js опирается на управление состоянием экземпляра компонента через его API. В отличие от стандартных HTML select-элементов, где изменение значения ограничено DOM-манипуляциями или присвоением value, библиотека Choices.js предоставляет набор методов, позволяющих изменять выбранные значения с учётом внутренней модели данных, синхронизации UI и событийной системы.
Каждый экземпляр Choices.js хранит данные в виде структурированных объектов опций. Внутри различаются:
Программная установка значения всегда проходит через синхронизацию этих структур, а не напрямую через DOM.
Центральным инструментом является метод:
setChoiceByValue(value)
Он применяется для установки одного значения или массива значений в зависимости от конфигурации элемента.
const element = document.querySelector('#select');
const choices = new Choices(element);
choices.setChoiceByValue('apple');
При выполнении происходит:
Важно, что значение должно существовать в списке choices, иначе установка игнорируется.
Для мультиселекта метод принимает массив:
choices.setChoiceByValue(['apple', 'banana', 'orange']);
В этом случае библиотека:
Особенность заключается в том, что порядок значений в массиве сохраняется в интерфейсе, что важно при работе с приоритетными списками.
Если переданное значение не найдено среди доступных опций:
Такой подход предотвращает разрушение состояния при динамическом изменении данных.
Во многих сценариях требуется явная очистка перед установкой нового набора значений. Choices.js предоставляет метод:
clearStore()
или более специализированный:
removeActiveItems()
Пример последовательности:
choices.removeActiveItems();
choices.setChoiceByValue(['one', 'two']);
Это гарантирует отсутствие остаточных выбранных значений.
Альтернативный способ управления состоянием реализуется через метод:
addItem(item)
Он позволяет добавлять элементы, которые могут не существовать в исходном списке.
choices.addItem({
value: 'new-value',
label: 'New Value',
selected: true
});
В отличие от setChoiceByValue, этот метод:
addItems: trueКаждое программное изменение значения приводит к синхронизации с
исходным <select> элементом:
Таким образом, Choices.js остаётся совместимой с нативным поведением HTML-форм.
При программной установке значений библиотека учитывает:
Если значение соответствует disabled-элементу, оно не будет выбрано,
даже при явном указании в setChoiceByValue.
При активированном поиске (search enabled):
Это предотвращает потерю выбранных значений при динамическом поиске.
Повторный вызов setChoiceByValue полностью
перезаписывает текущее состояние:
choices.setChoiceByValue('apple');
choices.setChoiceByValue('banana');
В результате выбранным останется только banana.
Каждое изменение сопровождается внутренними событиями:
Это позволяет подключать внешнюю реактивную логику.
При использовании сложных данных структура значения может быть расширена:
choices.setChoiceByValue([
{ value: '1', label: 'One' },
{ value: '2', label: 'Two' }
]);
Однако стандартная практика предполагает использование только
value, так как Choices.js сопоставляет данные по этому
ключу.
Если экземпляр Choices.js пересоздаётся:
setChoiceByValue после
инициализацииПри установке большого количества значений важно учитывать:
Пример оптимального подхода:
choices.setChoiceByValue(largeArray);
вместо:
largeArray.forEach(v => choices.setChoiceByValue(v));
При загрузке данных через API часто используется последовательность:
fetch('/api/options')
.then(r => r.json())
.then(data => {
const choices = new Choices('#select', {
choices: data
});
choices.setChoiceByValue(['preselected']);
});
Такой подход предотвращает рассинхронизацию между UI и состоянием данных.
Существуют ключевые ограничения:
Эти ограничения обеспечивают предсказуемость состояния компонента и предотвращают неконсистентность данных.