В библиотеке Gridstack.js управление событиями играет ключевую роль при динамическом взаимодействии с сеткой и её элементами. Помимо подписки на события, очень важно уметь корректно отписываться от них, чтобы избежать утечек памяти и конфликтов при повторной инициализации сетки или динамическом удалении элементов.
Gridstack.js поддерживает множество событий, связанных с изменением состояния сетки или отдельных виджетов:
added — когда виджет добавлен в сетку.removed — когда виджет удалён.change — при изменении позиции или размера
виджета.dragstart, dragstop — начало и конец
перетаскивания.resizestart, resizestop — начало и конец
изменения размера.Эти события подписываются с помощью метода
.on(eventName, callback) на экземпляре сетки:
const grid = GridStack.init();
grid.on('change', function(event, items) {
console.log('Изменились виджеты:', items);
});
Gridstack.js предоставляет два основных способа отписки от событий:
.off(eventName, callback).
Он принимает те же параметры, что и .on:function onChangeHandler(event, items) {
console.log('Изменились виджеты:', items);
}
grid.on('change', onChangeHandler);
// Позже отписка от этого события
grid.off('change', onChangeHandler);
Важно: если передать в .off только название события без
ссылки на функцию, обработчики не будут удалены, что
является распространённой ошибкой.
.off(eventName) без второго параметра:grid.off('change'); // удаляет все функции, подписанные на событие 'change'
Это удобно при динамическом пересоздании сетки или при массовой очистке событий перед удалением элементов DOM.
grid.off(); // убирает все обработчики для всех событий
Динамическое удаление виджета с очисткой событий:
const widget = grid.addWidget({x:0, y:0, w:2, h:2});
function onWidgetChange(event, items) {
console.log('Изменение виджета:', items);
}
grid.on('change', onWidgetChange);
// Удаление виджета и очистка всех связанных событий
grid.removeWidget(widget);
grid.off('change', onWidgetChange);
Избежание утечек памяти при повторной инициализации сетки:
let grid = GridStack.init({/* настройки */});
// Подписка на события
grid.on('dragstop', handleDragStop);
// Удаление старой сетки и всех обработчиков
grid.destroy();
grid = GridStack.init({/* новые настройки */});
Метод destroy() автоматически убирает все слушатели
событий, привязанные к DOM и внутренним объектам Gridstack, поэтому
после вызова destroy() не требуется отдельная очистка
обработчиков.
Если виджеты добавляются и удаляются динамически, важно хранить
ссылки на функции-обработчики, чтобы корректно их
удалять. Использование анонимных функций внутри .on делает
невозможной последующую отписку:
// Неправильный подход:
grid.on('added', function(event, items) {
console.log('Виджет добавлен', items);
});
// невозможно удалить этот обработчик
// Правильный подход:
function onWidgetAdded(event, items) {
console.log('Виджет добавлен', items);
}
grid.on('added', onWidgetAdded);
grid.off('added', onWidgetAdded); // корректная отписка
Gridstack.js совместим с jQuery-стилем событий. Если используется
jQuery, методы .on и .off работают
аналогично:
$('#grid').on('change', onChangeHandler);
$('#grid').off('change', onChangeHandler);
Однако рекомендуется использовать стандартные методы Gridstack, так как они напрямую управляют внутренними структурами сетки и обеспечивают корректное взаимодействие с динамическими виджетами.
off
или destroy для предотвращения утечек памяти.grid.off()) при
полной переработке интерфейса, чтобы избежать неожиданных вызовов старых
обработчиков.Отписка от событий в Gridstack.js — не просто рекомендация, а необходимый элемент стабильного и безопасного управления сеткой, особенно в крупных приложениях с динамическим интерфейсом.