В библиотеке Tom Select управление выбранными значениями строится вокруг единообразной модели данных, независимо от режима работы (single, multiple, create). В основе лежит коллекция выбранных items, где каждый элемент представлен объектом с минимальной структурой:
value — уникальный идентификаторtext — отображаемая строкаdata-* или
кастомных источников)Внутренне Tom Select хранит выбранные элементы в состоянии инстанса,
синхронизируя его с DOM и оригинальным <select>.
Ключевой принцип: источник истины — состояние компонента, а не DOM.
Добавление значения выполняется через метод addItem. Он
работает как с существующими опциями, так и с динамически создаваемыми
значениями (при включённом create).
const ts = new TomSelect('#select');
ts.addItem('value1');
При вызове происходит последовательность действий:
<select>При использовании кастомных источников данных:
ts.addItem('v2', true);
Второй аргумент может управлять поведением поиска опции. При отсутствии совпадения возможно создание нового элемента (если разрешено конфигурацией).
Для режима multiple:
ts.addItems(['a', 'b', 'c']);
Механика:
Удаление осуществляется через метод removeItem.
ts.removeItem('value1');
При удалении:
<select>ts.clear();
Особенности:
ts.getValue();
В режиме multiple возвращает массив строк:
["a", "b", "c"]
В single-режиме возвращается строка или null.
ts.getSelectedOptions();
Каждый элемент содержит:
valuetext<select>Tom Select поддерживает двустороннюю синхронизацию:
<select><select> → могут отражаться в Tom
Select (если не отключено)При каждом изменении:
selectedIndex или
selectedOptionschangeconst select = document.querySelector('#select');
select.value = 'newValue';
select.dispatchEvent(new Event('change'));
Tom Select перехватит событие и синхронизирует состояние.
В multiple-режиме выбранные элементы представлены как набор независимых тегов.
Удаление и повторное добавление может менять порядок:
ts.removeItem('a');
ts.addItem('a');
Внутренние механизмы предотвращают:
Если значение уже выбрано:
При попытке добавить несуществующую опцию:
createcreate: false операция отклоняетсяcreate: true создаётся новая опцияВсе значения приводятся к строковому виду:
"1" и 1 считаются одинаковымиКаждое изменение вызывает цепочку событий.
change — общее изменение состоянияitem_add — добавление элементаitem_remove — удаление элементаts.on('item_add', function(value){
console.log('Добавлено:', value);
});
При добавлении:
addItemitem_addchangeВыбранные элементы могут иметь пользовательское отображение через
render.item.
new TomSelect('#select', {
render: {
item: function(data) {
return `<div class="item">${data.text}</div>`;
}
}
});
ts.setValue(['x', 'y']);
Поведение:
ts.sync();
Используется для:
При отправке формы <select> с Tom Select ведёт
себя как стандартный input:
const formData = new FormData(form);
Результат включает все выбранные значения без дополнительных преобразований.
Каждый выбранный элемент проходит стадии:
При удалении процесс обратный:
<select>Основные методы:
addItem(value)addItems(values[])removeItem(value)clear()setValue(values)getValue()Эти методы формируют единый слой управления, исключающий прямую модификацию DOM как способ изменения выбранных элементов.
При загрузке опций через AJAX:
Возможные сценарии:
При повторной инициализации:
<select>valueTom Select не допускает:
<select> и внутренним
спискомЛюбая операция проходит через единый слой нормализации данных, обеспечивающий согласованность всех представлений выбранных элементов.