В Slim Select обработка событий строится вокруг колбэков, которые получают не «чистый» DOM Event, а расширенный объект состояния. Он объединяет информацию из нативного события браузера, текущее состояние компонента и данные выбранных элементов.
В зависимости от версии и конфигурации, события могут приходить как результат внутренних действий библиотеки: выбора элемента, открытия списка, фильтрации или закрытия выпадающего меню. При этом объект, передаваемый в обработчик, выступает как контейнер, который описывает контекст произошедшего изменения.
Ключевая особенность заключается в том, что Slim Select не
ограничивается стандартной моделью event.target. Вместо
этого формируется структурированный объект, в котором содержится текущее
состояние инстанса и данные выбора.
В типичном обработчике Slim Select объект события содержит несколько устойчивых компонентов:
<select>Дополнительно могут присутствовать поля, зависящие от конкретного типа события:
Нативный объект Event в Slim Select не является
центральной частью модели, но часто включается внутрь пользовательского
объекта как вспомогательный элемент.
В таких случаях он сохраняется в поле:
event.originalEventeventНативное событие содержит стандартные свойства DOM:
type — тип события (change,
click и т.д.)target — элемент, инициировавший событиеtimeStamp — время возникновения событияbubbles, cancelable — поведение события в
DOMОднако Slim Select не опирается на него напрямую для логики работы. Он используется только как источник низкоуровневой информации.
Одним из ключевых элементов объекта события является ссылка на экземпляр Slim Select:
slim — объект, через который можно получить доступ к
текущей конфигурации и состояниюЧерез него доступны:
Пример логической структуры:
{
value: ["1", "3"],
data: [
{ text: "Option 1", value: "1" },
{ text: "Option 3", value: "3" }
],
slim: SlimSelectInstance
}
Такое объединение данных позволяет не обращаться к DOM напрямую для получения состояния компонента.
Поле data содержит нормализованное представление
выбранных опций. Slim Select преобразует <option>
элементы в унифицированную структуру:
text — отображаемый текстvalue — значениеselected — состояние выбораЭто важно, потому что исходный DOM <option> может
содержать произвольные атрибуты, но Slim Select приводит их к
предсказуемому виду.
В режиме множественного выбора data всегда представляет
массив, даже если выбрано минимальное количество элементов.
Структура объекта события зависит от режима работы компонента.
{
value: "2",
data: { text: "Option 2", value: "2" }
}
Здесь data — одиночный объект, а value —
строка или число.
{
value: ["2", "5"],
data: [
{ text: "Option 2", value: "2" },
{ text: "Option 5", value: "5" }
]
}
Здесь оба поля становятся массивами.
Slim Select использует событийную модель через конфигурационный объект:
new SlimSelect({
select: '#example',
events: {
afterChange: (info) => {
console.log(info.value);
console.log(info.data);
}
}
});
Параметр info и есть объект события, который формируется
библиотекой. Он не является стандартным Event, а
представляет собой агрегированное состояние.
В зависимости от версии и конфигурации могут появляться дополнительные свойства:
select,
deselect, clear)Эти поля особенно полезны при реализации сложной логики интерфейса, где важно отслеживать не только факт изменения, но и его характер.
Объект события Slim Select обычно является производным от внутреннего состояния компонента, поэтому:
slim всегда отражают актуальное
состояниеЭто означает, что сохранение объекта события «на потом» может приводить к несоответствию данных, если компонент был изменён после его генерации.
Хотя Slim Select формирует собственные объекты, он также
синхронизирует состояние с оригинальным <select>
элементом. Это приводит к тому, что:
value всегда соответствует DOM-состояниюchangeВ таких случаях объект события Slim Select и DOM Event существуют параллельно, но используются для разных уровней логики.
В стандартном объекте события Slim Select отсутствует явное поле ошибки, однако косвенные признаки могут появляться:
data при наличии valuenull или undefined в slim при
некорректной инициализацииПодобные ситуации обычно связаны с асинхронным обновлением или внешним изменением DOM без уведомления Slim Select.
Объект события выступает связующим звеном между:
За счёт этого Slim Select минимизирует необходимость прямого взаимодействия с DOM и предоставляет единый слой данных, отражающий текущее состояние селектора в любой момент времени.