Gridstack.js предоставляет мощный механизм для работы с событиями, который позволяет отслеживать действия пользователя с виджетами на сетке и выполнять произвольные функции при этих событиях. Подписка на события является фундаментальным инструментом для динамического управления интерфейсом.
Gridstack.js поддерживает несколько категорий событий, которые можно разделить на события изменения состояния сетки и события действий с виджетами.
change Вызывается, когда изменяется расположение или размер виджетов в сетке. Возвращает массив объектов, содержащих информацию о каждом виджете, который был изменён.
grid.on('change', function(event, items) {
items.forEach(function(item) {
console.log(`Widget ${item.id} изменён: x=${item.x}, y=${item.y}, w=${item.w}, h=${item.h}`);
});
});added Срабатывает при добавлении новых виджетов в сетку.
grid.on('added', function(event, items) {
console.log(`Добавлено ${items.length} виджетов`);
});removed Срабатывает при удалении виджетов из сетки.
grid.on('removed', function(event, items) {
console.log(`Удалено ${items.length} виджетов`);
});dragstart / drag / dragstop Отслеживают начало перетаскивания, процесс перемещения и завершение перетаскивания виджета.
grid.on('dragstart', function(event, ui) {
console.log(`Начато перетаскивание виджета ${ui.node.id}`);
});
grid.on('dragstop', function(event, ui) {
console.log(`Завершено перетаскивание виджета ${ui.node.id}`);
});resizestart / resize / resizestop Аналогично событиям перетаскивания, но для изменения размера виджетов.
grid.on('resizestop', function(event, ui) {
console.log(`Виджет ${ui.node.id} изменил размер: w=${ui.node.w}, h=${ui.node.h}`);
});on и удаление слушателейGridstack.js использует стандартный подход jQuery-подобного события:
on для добавления подписчиков и off для их
удаления.
function onChangeHandler(event, items) {
console.log('Событие изменения сетки', items);
}
grid.on('change', onChangeHandler);
// Удаление обработчика
grid.off('change', onChangeHandler);
Такой способ полезен для динамического управления событиями и предотвращения утечек памяти.
События Gridstack.js позволяют передавать дополнительные
данные через объект виджета (node) или через
параметры события. Например, можно хранить пользовательские
идентификаторы или метаданные:
grid.on('added', function(event, items) {
items.forEach(item => {
console.log(`Добавлен виджет с userId=${item.el.dataset.userId}`);
});
});
Здесь dataset используется для хранения любых
произвольных данных, которые можно передавать вместе с виджетом.
Иногда необходимо слушать все события конкретного виджета без привязки к типу действия. Для этого можно использовать универсальный обработчик:
grid.engine.nodes.forEach(node => {
node.el.addEventListener('change', function(e) {
console.log('Произошло изменение виджета', node.id);
});
});
Этот подход подходит для комплексных интерфейсов с динамическим добавлением виджетов, когда нужно реагировать на изменения конкретного элемента.
off, если обработчик может стать
ненужным, особенно при удалении виджетов.dragstop и resizestop
для обновления данных на сервере, чтобы избежать лишних запросов при
каждом движении.Подписка на события Gridstack.js является ключевым инструментом для создания интерактивных, динамических интерфейсов, позволяя отслеживать любые действия пользователя и управлять состоянием виджетов в реальном времени.