Библиотека Tom Select построена вокруг событийной модели, позволяющей реагировать на изменения состояния компонента без необходимости модифицировать внутреннюю логику. Все ключевые действия — выбор значений, ввод текста, загрузка данных, открытие и закрытие выпадающего списка — транслируются в набор событий, которые можно перехватывать через единый API.
Основной механизм подписки реализован через метод:
tomSelect.on(eventName, handler)
Удаление обработчика:
tomSelect.off(eventName, handler)
События исполняются в контексте экземпляра Tom Select, что позволяет
внутри обработчиков обращаться к текущему состоянию компонента через
this.
Событие change вызывается при любом изменении значения
поля, включая добавление и удаление элементов.
const ts = new TomSelect("#select", {
onChange(value) {
console.log("Текущее значение:", value);
}
});
Эквивалент через событийный API:
ts.on("change", (value) => {
console.log(value);
});
Особенности:
Событие item_add срабатывает при добавлении нового
элемента в выбранные значения.
ts.on("item_add", (value, item) => {
console.log("Добавлен элемент:", value);
console.log("DOM-элемент:", item);
});
Параметры:
value — значение добавленного элементаitem — HTML-узел элемента в интерфейсеИспользуется для:
Событие удаления выбранного элемента.
ts.on("item_remove", (value, item) => {
console.log("Удалён элемент:", value);
});
Особенности:
Событие type генерируется при вводе текста в поле
поиска.
ts.on("type", (query) => {
console.log("Пользователь ввёл:", query);
});
Характеристики:
Пример с задержкой:
let timeout;
ts.on("type", (query) => {
clearTimeout(timeout);
timeout = setTimeout(() => {
console.log("Запрос к серверу:", query);
}, 300);
});
Срабатывает при открытии списка опций.
ts.on("dropdown_open", () => {
console.log("Список открыт");
});
Используется для:
Срабатывает при закрытии выпадающего списка.
ts.on("dropdown_close", () => {
console.log("Список закрыт");
});
Особенности:
Событие load используется в конфигурациях с удалённой
загрузкой (load callback или
loadThrottle).
const ts = new TomSelect("#select", {
load: function(query, callback) {
fetch(`/api?q=${query}`)
.then(res => res.json())
.then(data => callback(data));
}
});
ts.on("load", (options) => {
console.log("Загружены данные:", options);
});
Особенности:
Событие обработки ошибок загрузки или внутренней логики.
ts.on("error", (error) => {
console.error("Ошибка Tom Select:", error);
});
Применение:
Срабатывает после полной инициализации компонента.
ts.on("initialize", () => {
console.log("Tom Select готов");
});
Особенности:
Событие уничтожения экземпляра.
ts.on("destroy", () => {
console.log("Компонент уничтожен");
});
Используется для:
Добавление новой опции в список доступных значений.
ts.on("option_add", (value, data) => {
console.log("Добавлена опция:", value, data);
});
Удаление опции из списка.
ts.on("option_remove", (value) => {
console.log("Удалена опция:", value);
});
Эти события полезны при динамическом управлении справочниками.
Срабатывает при очистке выбранных значений.
ts.on("clear", () => {
console.log("Выбор очищен");
});
Особенности:
clear() и пользовательской очисткеchange напрямую, но обычно сопровождается
имTom Select вызывает события последовательно, в зависимости от внутреннего потока операций:
item_add, item_remove,
change и т.д.)Понимание порядка важно при построении сложных реактивных систем, где несколько обработчиков могут влиять друг на друга.
В обработчиках событий this указывает на экземпляр Tom
Select:
ts.on("change", function(value) {
console.log(this.items);
});
Использование стрелочных функций изменяет контекст:
ts.on("change", (value) => {
console.log(this); // не Tom Select
});
При необходимости доступа к экземпляру предпочтительно использовать обычные функции.
При работе с несколькими событиями применяется цепочка подписок:
ts.on("change", handler)
.on("item_add", handler)
.on("item_remove", handler);
Либо централизованная регистрация:
const handlers = {
change(value) {},
item_add(value) {},
item_remove(value) {}
};
Object.entries(handlers).forEach(([event, fn]) => {
ts.on(event, fn);
});
Корректное удаление обработчиков предотвращает утечки памяти:
function onChange(value) {
console.log(value);
}
ts.on("change", onChange);
// позже
ts.off("change", onChange);
При уничтожении экземпляра рекомендуется явно снимать критические подписки, особенно если Tom Select интегрирован в SPA-архитектуру.
Сложные сценарии строятся на комбинации событий:
ts.on("item_add", () => updateState());
ts.on("item_remove", () => updateState());
ts.on("clear", () => resetState());
Такой подход позволяет:
События type и change могут вызываться
часто при активном вводе. Для оптимизации применяются:
let timer;
ts.on("type", (query) => {
clearTimeout(timer);
timer = setTimeout(() => {
performSearch(query);
}, 250);
});
Система событий Tom Select позволяет полностью переопределять
поведение без модификации исходного кода. Через комбинацию
item_add, item_remove, change,
load и type реализуются:
Событийный слой выступает основным интерфейсом взаимодействия между внутренним состоянием компонента и внешней логикой приложения.