Объект настроек в Tom Select представляет собой единый
конфигурационный контейнер, определяющий поведение экземпляра: источник
данных, правила отображения, обработку ввода, создание элементов, работу
с плагинами и событиями. Архитектурно он является плоской структурой с
вложенными под-объектами только в отдельных областях (например,
render, plugins), что позволяет гибко
управлять функциональностью без необходимости наследования или сложной
композиции.
Типичная форма объекта настроек включает набор ключей верхнего уровня:
options — исходный набор данныхitems — выбранные значенияvalueField — поле значенияlabelField — поле отображенияsearchField — поля поискаplugins — подключаемые расширенияrender — шаблоны интерфейсаload — функция асинхронной загрузкиcreate — разрешение создания новых элементовonChange, onInitialize и другие
callback-иКаждый из этих ключей влияет на отдельный слой поведения компонента.
valueField: "id",
labelField: "title",
optgroupField: "category"
valueField определяет уникальный идентификатор
элементаlabelField задаёт отображаемый текстoptgroupField формирует группы опцийЭти поля являются фундаментом внутреннего сопоставления данных. При
отсутствии явной настройки используется стандартная логика поиска ключей
value и text, что может приводить к
неоднозначности при нестандартных структурах данных.
options: [
{ id: 1, title: "JavaScript" },
{ id: 2, title: "TypeScript" }
]
options содержит полный список доступных элементов.
Структура массива не ограничена, но должна соответствовать заданным
valueField и labelField.
items: [1]
items задаёт начально выбранные значения. Внутренне Tom
Select синхронизирует их с valueField, а не с объектами
целиком, что позволяет хранить компактные значения без дублирования
данных.
searchField: ["title", "description"]
Массив полей, по которым выполняется поиск. По умолчанию используется
только labelField.
Внутренний механизм поиска основан на сравнении строк с нормализацией регистра. При необходимости поведение переопределяется через кастомные обработчики или плагины, влияющие на стратегию ранжирования.
load: function(query, callback) {
fetch(`/api/items?q=${query}`)
.then(res => res.json())
.then(data => callback(data));
}
Функция load активируется при вводе пользователя и
отсутствии подходящих локальных опций. Основные особенности:
Внутренне результаты автоматически маппируются через
valueField и labelField.
create: true
Разрешает добавление пользовательских значений, отсутствующих в
options.
create: function(input) {
return {
id: input,
title: input
};
}
Функция позволяет контролировать структуру создаваемого объекта, что критично при строгой типизации данных.
createOnBlur: true
Автоматически создаёт элемент при потере фокуса, если введённое значение не найдено.
createFilter: function(input) {
return input.length > 2;
}
Фильтр определяет допустимость создания нового элемента.
Объект render управляет HTML-структурой интерфейса без
вмешательства в логику данных.
render: {
option: function(data, escape) {
return `<div>${escape(data.title)}</div>`;
},
item: function(data, escape) {
return `<div>${escape(data.title)}</div>`;
},
optgroup_header: function(data, escape) {
return `<div class="group">${escape(data.label)}</div>`;
}
}
plugins: {
remove_button: {},
dropdown_input: {}
}
Или сокращённая форма:
plugins: ["remove_button", "dropdown_input"]
Структура допускает как булевую активацию, так и передачу конфигурации плагина через объект.
События задаются прямо в объекте настроек.
onInitialize: function() {
console.log("initialized");
}
onChange: function(value) {
console.log(value);
}
onItemAdd: function(value) {},
onItemRemove: function(value) {}
События синхронизированы с внутренним состоянием компонента и вызываются после завершения соответствующих операций.
maxItems: 3
Ограничивает количество выбранных элементов. При превышении лимита новые выборы блокируются без ошибок.
persist: true
Определяет сохранение созданных элементов в списке
options.
delimiter: ","
Используется при работе с текстовыми значениями и сериализацией множественного выбора.
{
valueField: "id",
labelField: "title",
searchField: ["title", "tags"],
options: [
{ id: 1, title: "JavaScript", tags: "frontend" },
{ id: 2, title: "Node.js", tags: "backend" }
],
items: [1],
maxItems: 2,
create: true,
createOnBlur: true,
persist: false,
load: function(query, callback) {
fetch("/api?q=" + query)
.then(r => r.json())
.then(callback);
},
render: {
option: function(data, escape) {
return `<div>${escape(data.title)}</div>`;
},
item: function(data, escape) {
return `<span>${escape(data.title)}</span>`;
}
},
plugins: ["remove_button"],
onChange: function(value) {
console.log(value);
}
}
Объект настроек Tom Select проектируется как декларативная схема, в которой:
options vs
render)create,
load, maxItems)plugins)onChange,
onItemAdd)Такая организация обеспечивает предсказуемость жизненного цикла экземпляра и позволяет комбинировать статические и динамические источники данных без изменения базовой архитектуры компонента.