Gridstack.js позволяет создавать гибкие сетки, где одна сетка может содержать другую, формируя вложенные структуры. В таких случаях важно понимать, как события верхнего уровня взаимодействуют с событиями внутренней сетки. Без правильного управления вложенные сетки могут вести себя непредсказуемо: события drag, resize или change могут всплывать в родительскую сетку или игнорироваться.
Вложенная сетка создается внутри элемента родительской сетки. Например:
<div class="grid">
<div class="grid-stack-item" data-gs-x="0" data-gs-y="0" data-gs-width="6" data-gs-height="6">
<div class="grid-stack-item-content">
<div class="nested-grid">
<!-- Внутренние элементы -->
</div>
</div>
</div>
</div>
const parentGrid = GridStack.init({ /* параметры родительской сетки */ });
const nestedGrid = GridStack.init({ /* параметры вложенной сетки */ }, document.querySelector('.nested-grid'));
Ключевой момент: Gridstack.js различает DOM-элементы
родительской и вложенной сетки, поэтому события, такие как
change, added, removed, или
dragstop, необходимо обрабатывать отдельно для каждой
сетки.
Gridstack.js предоставляет несколько событий, с которыми стоит работать при вложенных сетках:
added – вызывается при добавлении
нового элемента в сетку. Для вложенной сетки важно подписываться на это
событие отдельно, иначе изменения родительской сетки не будут
учитываться внутренними элементами.
removed – срабатывает при удалении
элемента. Если элемент удаляется из вложенной сетки, событие не
передается родительской сетке автоматически.
change – отслеживает любое
перемещение или изменение размеров элементов. Для вложенной сетки это
событие позволяет синхронизировать внутренние элементы и, при
необходимости, выполнять корректировку размеров родительских
блоков.
dragstart / dragstop –
управление перетаскиванием элементов. Для вложенных сеток рекомендуется
использовать события drag с дополнительной проверкой
target, чтобы исключить случайное срабатывание родительских
обработчиков на внутренние элементы:
nestedGrid.on('dragstop', function(event, el) {
console.log('Элемент вложенной сетки перемещен', el);
});
По умолчанию события могут “всплывать” из вложенной сетки в родительскую, что иногда приводит к конфликтам. Чтобы этого избежать:
nestedGrid.on('change', function(event, items) {
event.stopPropagation();
console.log('Изменения только во вложенной сетке', items);
});
stopPropagation() предотвращает автоматическую обработку
события родительской сеткой. Это особенно важно при динамическом
изменении размеров элементов или при drag & drop, чтобы родительская
сетка не “перехватывала” действия вложенной.
Если элементы вложенной сетки изменяют размер, иногда требуется корректировать размеры родительских блоков, чтобы избежать наложений:
nestedGrid.on('change', function(event, items) {
const parentItem = parentGrid.getGridItems().find(item => item.el.contains(items[0].el));
parentGrid.update(parentItem.el, { width: calculateWidth(items), height: calculateHeight(items) });
});
Таким образом достигается динамическая адаптация родительской сетки к изменениям во вложенной.
event.stopPropagation() для контроля
всплытия.update,
removeWidget и addWidget.Эффективная работа с событиями во вложенных сетках Gridstack.js требует четкого разделения обработчиков и контроля всплытия, чтобы избежать конфликтов и обеспечить плавную работу интерфейса.