Архитектура расширения в Tom Select построена вокруг подключаемых модулей, которые интегрируются в жизненный цикл инстанса селекта. Плагин представляет собой изолированный набор логики, который получает доступ к внутренним методам экземпляра и может модифицировать поведение компонентов: input, dropdown, items, обработку событий и рендеринг.
Регистрация плагина выполняется до инициализации экземпляров,
поскольку система подключает расширения на этапе создания объекта
TomSelect. Основной механизм регистрации реализован через
статический метод определения расширения.
Каждый плагин объявляется через функцию, возвращающую объект с методами жизненного цикла. Регистрация связывает имя плагина с его реализацией.
TomSelect.define('custom_plugin', function(options){
return {
initialize: function(){
this.on('initialize', () => {
// логика инициализации
});
},
destroy: function(){
// очистка ресурсов
}
};
});
Имя плагина становится ключом, по которому он активируется в конфигурации экземпляра.
После регистрации плагин активируется через опцию
plugins. Поддерживается список подключаемых модулей, каждый
из которых должен быть предварительно определён.
new TomSelect('#select', {
plugins: ['custom_plugin']
});
При инициализации экземпляра Tom Select проходит по массиву плагинов,
связывает их с текущим инстансом и вызывает метод
initialize, если он определён.
Плагин получает доступ к контексту текущего экземпляра через
this. В этом контексте доступны внутренние методы
управления состоянием:
TomSelect.define('logger_plugin', function(){
return {
initialize: function(){
this.on('change', (value) => {
console.log('Изменено значение:', value);
});
}
};
});
Контекст плагина совпадает с контекстом экземпляра, что делает возможной глубокую модификацию поведения.
Конфигурация плагина может быть параметризована через объект
настроек, передаваемый при инициализации TomSelect.
TomSelect.define('max_items_plugin', function(options){
return {
initialize: function(){
this.on('item_add', () => {
if (this.items.length > options.max) {
this.removeItem(this.items[0]);
}
});
}
};
});
Использование:
new TomSelect('#select', {
plugins: {
max_items_plugin: {
max: 3
}
}
});
Такой подход позволяет создавать переиспользуемые модули с параметризованным поведением.
Плагин интегрируется в общий жизненный цикл экземпляра Tom Select. Основные этапы взаимодействия:
Инициализация Выполняется сразу после создания инстанса и построения DOM-структуры.
initialize: function(){
this.setupCustomState();
}
Подписка на события Плагины активно используют событийную модель для изменения поведения без прямого вмешательства в ядро.
this.on('dropdown_open', () => {
// реакция на открытие списка
});
Очистка ресурсов При уничтожении экземпляра
вызывается метод destroy, если он определён.
destroy: function(){
this.off('dropdown_open');
}
Tom Select предоставляет событийную шину, к которой плагины могут подключаться. Это основной механизм расширения поведения без модификации ядра.
Типичные события:
initializechangeitem_additem_removedropdown_opendropdown_closeПример обработки нескольких событий:
TomSelect.define('activity_tracker', function(){
return {
initialize: function(){
this.on('item_add', (value) => {
this.log('Добавлен элемент', value);
});
this.on('item_remove', (value) => {
this.log('Удалён элемент', value);
});
},
log: function(...args){
console.log('[TomSelect]', ...args);
}
};
});
Плагин может модифицировать существующие методы экземпляра. Такой подход используется для внедрения дополнительной логики до или после выполнения стандартного поведения.
TomSelect.define('override_input', function(){
return {
initialize: function(){
const original = this.onInput;
this.onIn put = (e) => {
console.log('Перехват ввода');
return original.call(this, e);
};
}
};
});
Механизм переопределения требует аккуратного сохранения оригинальных ссылок на методы, чтобы избежать потери базовой функциональности.
При подключении нескольких расширений возможны конфликты:
Для минимизации конфликтов применяется изоляция логики внутри пространства плагина и использование событий вместо прямого изменения состояния.
this.on('dropdown_open', () => {
// независимая реакция без вмешательства в другие плагины
});
Порядок подключения плагинов влияет на приоритет выполнения логики.
Система регистрации строится на глобальном реестре плагинов. При
вызове TomSelect.define происходит добавление записи в этот
реестр.
Далее при создании экземпляра:
initializeТакой подход обеспечивает отложенную инициализацию и переиспользуемость кода.
Используются несколько типичных шаблонов создания плагинов:
Функциональный плагин без состояния Используется для простого расширения поведения.
TomSelect.define('simple_hook', function(){
return {
initialize: function(){
this.on('change', (v) => console.log(v));
}
};
});
Плагин с состоянием Хранит внутренние данные внутри замыкания.
TomSelect.define('stateful_plugin', function(){
let counter = 0;
return {
initialize: function(){
this.on('item_add', () => counter++);
}
};
});
Плагин-обёртка Модифицирует существующие методы и сохраняет оригинальную логику.
TomSelect.define('wrapper_plugin', function(){
return {
initialize: function(){
const originalAddItem = this.addItem;
this.addItem = (value, silent) => {
console.log('Добавление:', value);
return originalAddItem.call(this, value, silent);
};
}
};
});
Количество подключённых плагинов напрямую влияет на время инициализации экземпляра. Каждый дополнительный модуль увеличивает:
Рациональная регистрация предполагает подключение только необходимых расширений, поскольку избыточные плагины увеличивают стоимость операций рендеринга и обновления состояния.
В масштабных системах плагины часто выносятся в отдельные модули:
Регистрация выполняется централизованно до инициализации интерфейсного слоя, что обеспечивает предсказуемость поведения всех экземпляров Tom Select в приложении.