Работа с Tom Select всегда строится вокруг объекта экземпляра, который создаётся при инициализации и содержит весь публичный API: управление значениями, элементами, поиском, опциями и жизненным циклом компонента. Корректное получение и сохранение этого экземпляра определяет возможность дальнейшего программного управления селектом.
Основной способ получения экземпляра — прямое создание через
конструктор. При вызове new TomSelect(...) возвращается
объект, который сразу можно использовать для управления компонентом.
const select = new TomSelect('#select-element', {
create: true,
maxItems: 5,
placeholder: 'Выбор значения'
});
Переменная select в данном случае содержит полный
экземпляр, связанный с указанным DOM-элементом. Этот объект становится
точкой входа для всех дальнейших операций: добавления, удаления,
фильтрации и изменения состояния.
Ключевой момент заключается в том, что повторное получение экземпляра через конструктор не требуется — достаточно один раз сохранить ссылку.
При создании нескольких компонентов на странице обычно используется коллекция, в которой каждый экземпляр сохраняется отдельно.
const selects = {};
document.querySelectorAll('.ts').forEach((el, index) => {
selects[index] = new TomSelect(el, {
maxItems: 3
});
});
Такой подход позволяет централизованно управлять всеми экземплярами и обращаться к ним по идентификатору, DOM-узлу или логическому ключу.
После инициализации Tom Select сохраняет ссылку на свой экземпляр непосредственно в DOM-элементе. Это позволяет получить доступ к уже созданному объекту без необходимости хранить переменные.
const el = document.querySelector('#select-element');
const instance = el.tomselect;
Свойство tomselect появляется на исходном
<select> после инициализации. Оно содержит тот же
объект, который был создан конструктором.
Этот способ особенно полезен в следующих случаях:
При попытке повторной инициализации на одном и том же элементе важно учитывать, что экземпляр уже существует. Обычно Tom Select предотвращает дублирование, но доступ к текущему объекту остаётся через DOM-свойство.
const el = document.querySelector('#select-element');
if (el.tomselect) {
el.tomselect.clear();
}
Здесь используется проверка существования экземпляра перед выполнением операций. Такой подход предотвращает создание конфликтующих состояний.
При добавлении новых элементов в DOM после загрузки страницы экземпляр также создаётся стандартным способом, но ссылка должна быть сохранена сразу после инициализации.
function createSelect(container) {
const select = document.createElement('select');
container.appendChild(select);
const instance = new TomSelect(select, {
create: true
});
return instance;
}
Отсутствие сохранённой ссылки приводит к необходимости обращения
через select.tomselect, что может быть менее удобно в
сложных структурах приложения.
Полученный экземпляр используется не только для доступа к данным, но и для управления состоянием компонента.
const ts = new TomSelect('#select', {});
ts.addOption({ value: '1', text: 'Первый' });
ts.addItem('1');
ts.clear();
ts.destroy();
Каждый метод работает непосредственно с экземпляром, поэтому корректное его получение является обязательным условием стабильной работы интерфейса.
При архитектуре с компонентным подходом экземпляры обычно хранятся в состоянии модуля или класса.
class SelectManager {
constructor() {
this.instances = new Map();
}
init(el) {
const instance = new TomSelect(el, {});
this.instances.set(el, instance);
}
get(el) {
return this.instances.get(el) || el.tomselect;
}
}
Комбинирование хранения в структуре данных и доступ через DOM обеспечивает устойчивость к перерисовкам интерфейса и повторной инициализации.
После вызова destroy() ссылка в DOM может сохраняться,
но становится неактуальной для управления компонентом.
const el = document.querySelector('#select');
const ts = el.tomselect;
ts.destroy();
// el.tomselect может быть очищен или устареть
Поэтому при работе с динамическими интерфейсами важно синхронизировать состояние приложения и фактическое состояние DOM-элементов.
Экземпляр часто доступен через контекст событий или замыкания, что позволяет избегать глобальных переменных.
const ts = new TomSelect('#select', {
onChange(value) {
console.log('Изменено значение:', value);
this.refreshOptions();
}
});
Внутри обработчиков this указывает на текущий экземпляр,
что делает возможным прямое управление компонентом без дополнительных
ссылок.
В рамках одной страницы применяются несколько стандартных методов получения экземпляра:
new TomSelect(...);element.tomselect;this внутри событийных обработчиков.Каждый способ ориентирован на разные сценарии архитектуры, но все они приводят к одному объекту — экземпляру Tom Select, через который выполняется всё управление компонентом.