В основе Tom Select лежит модульная архитектура, в которой ядро отвечает за управление состоянием, рендерингом и взаимодействием с DOM, а расширения реализуются через систему плагинов. Такая модель позволяет изолировать базовую логику выбора и поиска от дополнительных функций вроде кастомных рендеров, автозагрузки, тегирования и модификации поведения интерфейса.
Ядро Tom Select строится вокруг одного центрального класса, который инкапсулирует:
Плагины подключаются поверх ядра и получают доступ к его внутренним методам и событиям через единый интерфейс расширения.
Система плагинов Tom Select основана на объектной карте расширений, где ключ — имя плагина, а значение — функция-инициализатор.
При инициализации экземпляра происходит разбор конфигурации:
Типичная форма подключения:
new TomSelect('#select', {
plugins: ['remove_button', 'dropdown_input']
});
Каждый элемент массива соответствует зарегистрированному плагину, который должен быть доступен в глобальном реестре Tom Select.
Tom Select хранит плагины в виде статического реестра. Он представляет собой объект, где:
Пример логической структуры:
TomSelect.define('plugin_name', function(options) {
// логика расширения
});
При запуске экземпляра выполняется проверка:
Если плагин не найден, он игнорируется без остановки выполнения.
Каждый плагин представляет собой функцию, которая вызывается в контексте экземпляра Tom Select. Контекст содержит доступ к внутренним API:
this — текущий экземпляр;Обобщённая сигнатура:
function plugin(options) {
// расширение поведения экземпляра
}
Плагин может:
Плагин проходит несколько стадий жизненного цикла в рамках экземпляра:
Выполняется сразу после создания основного объекта и до первого рендера интерфейса. На этом этапе доступны базовые структуры данных, но DOM может быть ещё не полностью сформирован.
Основные задачи:
На этом этапе плагин начинает взаимодействовать с методами ядра:
Техника оборачивания методов часто используется через сохранение оригинальной функции:
const original = this.method;
this.method = function() {
// дополнительная логика
return original.apply(this, arguments);
};
После завершения инициализации плагин функционирует в рамках событийной модели:
При уничтожении экземпляра вызываются процедуры очистки:
Событийная модель Tom Select является центральным механизмом интеграции плагинов. Каждый экземпляр поддерживает поток событий, через который проходят все ключевые действия:
Плагин может подписываться на события:
this.on('item_add', function(value) {
// реакция на добавление элемента
});
Также доступна возможность перехвата событий до их завершения или отмены логики через возврат false.
Одна из ключевых возможностей плагинов — изменение поведения встроенных методов. Это достигается через паттерн декорирования.
Типовой механизм:
Пример логики:
const originalAddItem = this.addItem;
this.addItem = function(value, silent) {
// предварительная обработка
return originalAddItem.call(this, value, silent);
};
Такой подход позволяет расширять поведение без изменения исходного ядра.
Плагины имеют доступ к ключевым DOM-узлам компонента:
Изменение DOM происходит напрямую, без промежуточного виртуального слоя. Это означает, что плагины несут ответственность за корректность внесённых изменений.
Пример манипуляции:
this.control_input.setAttribute('autocomplete', 'off');
this.dropdown.classList.add('custom-class');
Плагины могут принимать собственные параметры через основной объект конфигурации Tom Select. Каждый плагин извлекает свою секцию настроек:
new TomSelect('#select', {
plugins: {
remove_button: {
title: 'Удалить элемент'
}
}
});
Внутри плагина параметры доступны как аргумент функции и могут использоваться для настройки поведения.
При подключении нескольких расширений важно учитывать порядок и возможные конфликты. Tom Select не навязывает строгую систему приоритетов, поэтому взаимодействие происходит через:
Типичный риск — перекрытие одинаковых методов разными плагинами. В таких случаях последний подключённый плагин получает приоритет.
Плагины могут добавлять новые методы в экземпляр Tom Select, расширяя публичный API:
this.clearAll = function() {
this.clear();
this.refreshItems();
};
После добавления такие методы становятся частью экземпляра и доступны наряду с базовыми функциями.
Внутреннее состояние Tom Select включает:
Плагины могут напрямую модифицировать эти структуры, но чаще используют публичные методы, чтобы избежать рассинхронизации UI и состояния.
Плагины выполняются в одном контексте с ядром, без строгой изоляции. Это создаёт гибкость, но требует аккуратного обращения с:
Ошибки в плагинах способны повлиять на весь компонент, так как отсутствует sandbox-слой.
Плагины выполняют функцию горизонтального расширения ядра. Вместо усложнения базового класса вводится слой подключаемых модулей, который обеспечивает:
Такая структура делает систему Tom Select не монолитной, а композиционной, где поведение компонента определяется набором подключённых расширений.