Gridstack.js предоставляет мощные механизмы для динамического управления элементами сетки, включая удаление виджетов. Управление событиями удаления позволяет отслеживать действия пользователя и выполнять дополнительные операции, такие как обновление данных на сервере, анимации удаления или логирование.
В Gridstack.js удаление виджетов может выполняться различными способами:
Метод removeWidget
const grid = GridStack.init();
const el = document.querySelector('.grid-stack-item');
grid.removeWidget(el, true); // true — удалить DOM элемент полностью
false, что только
убирает его из сетки, оставляя в DOM.Метод removeAll Удаляет все виджеты
из сетки одновременно:
grid.removeAll(true); // удаляет все виджеты с DOMGridstack.js предоставляет встроенные события, которые вызываются при удалении виджетов:
removed Срабатывает после того, как
виджет был удалён из сетки (и, при необходимости, из DOM). Пример:
grid.on('removed', function(event, items) {
items.forEach(item => {
console.log('Удалён виджет:', item.el);
});
});
Здесь items — массив объектов виджетов, которые были
удалены, каждый из которых содержит:
el — DOM-элемент виджетаx, y, width,
height — позиция и размеры виджета до удаленияid — идентификатор виджета, если он был установленОтслеживание удалений с помощью
change Событие change срабатывает при
любом изменении сетки, включая удаление, добавление или перемещение
виджетов. Для фильтрации удалений:
grid.on('change', function(event, items) {
items.forEach(item => {
if (item._removed) {
console.log('Виджет помечен как удалён:', item.el);
}
});
});
Флаг _removed используется внутренне для обозначения
виджетов, которые были удалены в рамках операции изменения
сетки.
Анимации удаления Можно обернуть удаление виджета в анимацию, чтобы плавно скрывать элемент перед удалением:
const el = document.querySelector('.grid-stack-item');
el.classList.add('fade-out'); // CSS анимация
el.addEventListener('animationend', () => {
grid.removeWidget(el, true);
});Обратные вызовы перед удалением Gridstack.js позволяет перехватывать событие удаления через пользовательские функции:
function beforeRemove(el) {
return confirm('Удалить виджет?');
}
grid.on('removed', function(event, items) {
items.forEach(item => {
if (!beforeRemove(item.el)) {
grid.addWidget(item.el); // возвращаем виджет в сетку
}
});
});Удаление с серверной синхронизацией Часто необходимо удалить виджет и одновременно удалить запись на сервере:
grid.on('removed', function(event, items) {
items.forEach(item => {
fetch(`/api/delete-widget/${item.id}`, { method: 'DELETE' });
});
});Если виджет удаляется перетаскиванием за пределы сетки:
Включение опции removeTimeout:
const grid = GridStack.init({
removable: true,
removeTimeout: 200 // миллисекунды до окончательного удаления
});
removed для выполнения
финальной очистки.Перетаскивание с откатом (revert) также влияет на удаление: если
отменить удаление через revert, виджет останется в
сетке.
removed для логики после удаления,
а не для проверки возможности удаления — для этого лучше отдельный
колбэк перед удалением.removeAll
аккуратно, так как это может вызвать множественные события
removed и нагрузку на DOM.События удаления в Gridstack.js позволяют:
changeЭти инструменты обеспечивают полное управление динамическими виджетами и гибкую интеграцию с бизнес-логикой приложения.