Tom Select работает как надстройка над стандартным HTML
<select> и сохраняет с ним двустороннюю
синхронизацию. Внутренне библиотека создаёт собственную структуру UI, но
исходный элемент остаётся источником состояния формы, что критично для
отправки данных, деградации без JavaScript и интеграции с серверным
рендерингом.
Ключевая идея заключается в том, что:
<select> сохраняет актуальное
значение;При создании экземпляра Tom Select происходит чтение текущего
состояния <select>:
<option> преобразуются в
items;selected интерпретируется как источник
истины.Если <select> уже содержит значения:
<select id="tags" multiple>
<option value="js" selected>JavaScript</option>
<option value="ts">TypeScript</option>
</select>
После инициализации:
items = ["js"]<select> остаётся неизменённым,
кроме внутренней синхронизации состояния объектаTom Select разделяет состояние на три уровня:
DOM <select>
<option selected>valueВнутренний state Tom Select
itemsUI слой
Синхронизация всегда проходит через state слой, который затем транслируется в DOM.
<select>Метод setValue() является базовой точкой
синхронизации:
selected у
<option>;Поведение:
addItem(value):
<option selected>;removeItem(value):
Эти методы обеспечивают более стабильную синхронизацию при частичных изменениях.
<select> и DOMИзменения, происходящие напрямую в <select>, могут
быть подхвачены через:
change;refreshItems() (внутренние
механизмы);Пример внешнего изменения:
select.value = "ts";
select.dispatchEvent(new Event("change"));
В этом случае Tom Select:
items;Событие change является ключевым каналом обратной
связи.
При изменениях:
<select>.value;change.Важно, что Tom Select старается сохранить совместимость с обычной формой:
form.submit() получает актуальные значения;Для multiple-режима используется массив значений:
<select multiple>
Особенности:
<option selected>;value <select> становится
агрегированным;При удалении элемента:
selected только с одного option;Добавление новых опций требует явной синхронизации:
addOption();После добавления:
refreshOptions();Пример логики:
select.addOption({value: "go", text: "Go"});
select.refreshOptions(false);
Если этого не сделать:
Удаление <option> из DOM требует аккуратности:
Типичный сценарий:
Очистка состояния:
clear() снимает все выбранные значения;selected у всех
<option>;Для multiple:
В ряде сценариев требуется обновление без триггера событий:
Используется режим подавления событий:
change.Это предотвращает каскадные обработчики.
Метод destroy() выполняет обратную операцию:
<select>;Состояние не теряется, так как:
<option selected> остаются в DOM;При использовании <optgroup>:
Особенности синхронизации:
Расхождение может возникать при:
Типичный механизм восстановления:
<select>;Приоритет всегда остаётся за DOM <select> как
источником истины.
Система синхронизации Tom Select опирается на постоянное согласование трёх слоёв:
<select> как источник формы;Любое изменение проходит через один из каналов API или DOM-событий и приводит к приведению всех слоёв к согласованному состоянию без разрыва формы и стандартного поведения браузера.