В разных поколениях Tom Select наблюдается последовательный переход от модели, унаследованной от Selectize, к более модульной и предсказуемой архитектуре. Основной акцент смещается от «монолитного» объекта с неявными побочными эффектами к более управляемому состоянию компонента и явным контрактам методов.
Ключевое изменение — разделение внутреннего состояния (items, options, settings) и публичного API, который перестаёт быть прямым отражением внутренних структур и становится стабилизированным интерфейсом.
Ранние версии предполагали относительно гибкую, но не всегда предсказуемую инициализацию через конструктор:
new TomSelect('#select', {
create: true,
maxItems: 3
});
В более поздних версиях поведение инициализации стало строже:
Особое значение приобрела стабильность повторной инициализации: попытки повторно вызвать конструктор на одном элементе теперь обрабатываются более строго, с предотвращением дублирования инстанса.
Одним из наиболее заметных изменений между версиями стало уточнение модели данных.
Ранее:
value часто использовался как основной источник
состояния;items воспринимался как вспомогательное
представление.Позднее API разделяет эти понятия более строго:
items — внутренний список выбранных ключей;getValue() — публичный метод получения текущего
значения;setValue() — установка состояния с полной
перерисовкой.Изменилось поведение мультивыбора:
control.addItem(value);
control.removeItem(value);
В новых версиях эти методы стали синхронно обновлять внутреннее состояние и UI без необходимости ручного вызова refresh-методов, которые ранее часто требовались.
Также изменилось поведение очистки:
clear() теперь гарантированно сбрасывает состояние и
триггерит события изменения;Существенная часть миграции затрагивает методы управления состоянием компонента.
Ранее добавление значения часто требовало ручного контроля дубликатов:
addItem(value, silent);
Поведение параметра silent в новых версиях стало более
предсказуемым: он подавляет события, но не отменяет внутреннюю логику
перерасчёта состояния.
Удаление элементов стало менее «опасным»:
removeItem(value, silent);
В старых версиях удаление могло приводить к несогласованности между input value и визуальным состоянием при кастомных рендерах. В обновлённой архитектуре это устранено за счёт унифицированного слоя синхронизации.
Метод setValue() претерпел важную эволюцию:
При вызове:
control.setValue(['a', 'b']);
выполняется:
<select>.Модель событий в Tom Select эволюционировала от простого набора callback’ов к более структурированной event-driven системе.
Основные изменения:
Примеры событий:
control.on('change', value => {});
control.on('item_add', value => {});
control.on('item_remove', value => {});
control.on('dropdown_open', () => {});
control.on('dropdown_close', () => {});
Ключевое изменение — согласованность:
Особое внимание уделено событию change: оно стало строго
отражать финальное состояние после всех преобразований.
Система плагинов претерпела архитектурное переосмысление.
В ранних версиях:
В новых версиях:
Пример регистрации:
TomSelect.define('plugin_name', function(options) {
return {
init() {},
destroy() {}
};
});
Изменения:
init,
destroy);Система render подверглась значительным изменениям.
Ранее:
render: {
option(data, escape) {}
}
Проблема старого подхода заключалась в нестрогом контракте: структура
data могла меняться между версиями без явной фиксации.
В новых версиях:
data;Особое внимание уделено:
optionitemoption_createloadingТеперь рендеринг строго отделён от логики выбора, что уменьшает вероятность рассинхронизации UI и состояния.
Механизм load в старых версиях был гибким, но сложным в
контроле.
Ранее:
load: function(query, callback) {}
Проблемы:
В обновлённых версиях:
Изменилось поведение:
Жизненный цикл стал более формализованным:
Метод destroy() стал более надёжным:
<select>;При переходе между версиями наблюдается несколько устойчивых категорий изменений:
Некоторые методы сохранили смысл, но изменили внутреннюю реализацию:
Значительная часть миграционных проблем связана не с удалением API, а с изменением дефолтных параметров:
createmaxItemspersistcloseAfterSelectЭти параметры стали более строго интерпретироваться, без «неявных» fallback-значений.
В новых версиях:
В современных версиях Tom Select усилилась поддержка TypeScript, что повлияло на API:
Это привело к снижению «динамических» возможностей, характерных для раннего JavaScript-стиля, но повысило предсказуемость интеграции.
Пример типизированной конфигурации:
interface TomSelectOptions {
maxItems: number;
create: boolean;
load(query: string, callback: (options: any[]) => void): void;
}
Одно из ключевых улучшений — стабильная синхронизация между:
<select>;Ранее:
refresh() или повторные
инициализации.Теперь:
Эволюция API Tom Select характеризуется переходом к:
Стабилизация интерфейса методов делает поведение компонента менее зависимым от внутренней реализации и упрощает поддержку кода при обновлениях версий.