Предзаполненные значения в Choices.js представляют собой механизм инициализации компонента с уже выбранными элементами, которые отображаются в интерфейсе сразу после загрузки. Это ключевой функционал при работе с формами редактирования данных, восстановлением состояния, серверным рендерингом и динамическими интерфейсами, где необходимо синхронизировать начальное состояние UI с уже существующими значениями.
Choices.js опирается на исходный HTML-элемент
<select> или переданные данные для формирования
внутреннего состояния. Предзаполненные значения могут задаваться двумя
основными способами:
selected в HTML-разметкеВнутренне библиотека преобразует выбранные элементы в собственную структуру состояния, которая затем управляет отображением выбранных тегов и синхронизацией с оригинальным элементом формы.
Наиболее простой и предсказуемый способ задать начальные значения — использовать стандартный HTML:
<select id="city-select" multiple>
<option value="msk" selected>Москва</option>
<option value="spb">Санкт-Петербург</option>
<option value="nsk" selected>Новосибирск</option>
</select>
После инициализации Choices.js автоматически распознаёт отмеченные элементы и отображает их как выбранные:
const element = document.querySelector('#city-select');
const choices = new Choices(element, {
removeItemButton: true
});
option[selected] автоматически становятся
выбраннымиmultiple)Важно учитывать, что Choices.js считывает состояние один раз при инициализации. Последующие изменения HTML не будут автоматически отражены без вызова API.
Одним из наиболее надёжных способов программного управления
начальными значениями является метод setChoiceByValue. Он
позволяет явно задать выбранные элементы после инициализации
компонента.
const element = document.querySelector('#city-select');
const choices = new Choices(element, {
removeItemButton: true
});
choices.setChoiceByValue('msk');
Для множественных значений передаётся массив:
choices.setChoiceByValue(['msk', 'nsk']);
valueЭтот способ считается предпочтительным при работе с данными, полученными с сервера.
Choices.js допускает вызов метода предзаполнения сразу после создания экземпляра. Однако важно учитывать, что визуальное обновление происходит синхронно с внутренним рендером:
const choices = new Choices('#city-select');
choices.setChoiceByValue(['msk', 'spb']);
В этом случае библиотека сначала инициализирует структуру, затем применяет выбранные значения и отрисовывает теги.
Помимо setChoiceByValue, существует метод
setValue, который работает с объектами выбора и
используется при более сложных сценариях:
choices.setValue([
{ value: 'msk', label: 'Москва' },
{ value: 'spb', label: 'Санкт-Петербург' }
]);
setValue принимает полные объекты<option>Этот метод часто применяется в AJAX-режимах, когда список опций формируется программно.
Метод addItem используется для добавления выбранного
значения как элемента:
choices.addItem('msk');
или с объектом:
choices.addItem({
value: 'msk',
label: 'Москва',
selected: true
});
Этот метод часто применяется в ситуациях, когда пользовательский ввод превращается в выбранный элемент (например, тегирование).
При включённой опции создания новых элементов:
const choices = new Choices('#tags', {
createItem: true
});
можно заранее задать нестандартные значения:
choices.setValue([
{ value: 'custom-1', label: 'Пользовательский тег' }
]);
Если значение отсутствует в списке, Choices.js создаёт его как пользовательский элемент.
При наличии нескольких источников начальных данных применяется следующая логика:
selected в HTMLsetChoiceByValue, setValue,
addItem)При этом каждый последующий метод может перезаписать предыдущее состояние.
Choices.js всегда поддерживает двустороннюю синхронизацию:
<option selected>Пример внутреннего поведения:
const element = document.querySelector('select');
const choices = new Choices(element);
element.value = 'msk';
// UI не обновится автоматически
Для корректного обновления требуется:
choices.setChoiceByValue('msk');
При работе с AJAX-источниками данных предзаполнение часто выполняется после получения ответа:
fetch('/api/cities')
.then(res => res.json())
.then(data => {
const choices = new Choices('#city-select', {
choices: data
});
choices.setChoiceByValue(['msk', 'spb']);
});
Здесь важно соблюдать порядок:
Если в метод предзаполнения передаётся значение, которого нет в списке опций:
choices.setChoiceByValue(['unknown', 'msk']);
Результат: будет выбрано только msk.
Если выбранный элемент имеет атрибут disabled, поведение
зависит от способа предзаполнения:
choices.setValue([
{ value: 'msk', label: 'Москва', disabled: true }
]);
Такие элементы обычно используются для отображения фиксированных значений.
В режиме без multiple Choices.js допускает только одно
значение:
choices.setChoiceByValue('msk');
Если передан массив:
choices.setChoiceByValue(['msk', 'spb']);
будет выбрано только первое корректное значение.
Предзаполненные значения не зависят от состояния поиска. Даже если элемент не отображается в текущем фильтре, он остаётся выбранным и визуализируется в отдельной области выбранных элементов.
При использовании стандартного сброса формы:
<form>
<select id="city-select" multiple>
<option value="msk" selected>Москва</option>
<option value="spb">СПб</option>
</select>
<button type="reset">Reset</button>
</form>
Choices.js может не всегда автоматически сбрасывать состояние UI. В таких случаях требуется ручная синхронизация:
form.addEventListener('reset', () => {
choices.destroy();
new Choices('#city-select');
});
или повторное применение значений из DOM.
Логика предзаполненных значений в Choices.js строится на трёх уровнях:
Каждый уровень может модифицировать предыдущий, но итоговое состояние всегда контролируется внутренним store библиотеки, который синхронизирует UI и исходный элемент формы.