В библиотеке Muuri каждый элемент сетки может быть связан с событиями, которые вызываются при различных действиях: перемещение, сортировка, фильтрация, добавление или удаление элементов. Передача данных в эти обработчики позволяет гибко управлять поведением элементов и получать контекстные сведения о событии.
События в Muuri работают по принципу подписки через метод
on. Общий синтаксис выглядит так:
grid.on('eventName', function(item, event) {
// тело обработчика
});
eventName — имя события (dragStart,
dragReleaseEnd, filter, sort,
move и др.).item — объект Muuri.Item, на который
ссылается событие.event — объект стандартного события DOM (например,
MouseEvent), если оно было инициировано пользователем.itemОбъект Muuri.Item содержит несколько ключевых свойств,
которые можно использовать для передачи данных:
element — DOM-элемент, соответствующий
элементу сетки.getData() — возвращает объект данных,
ассоциированных с элементом (см. ниже раздел про add и
setData).getIndex() — индекс элемента в текущей
сетке.isDragging() — возвращает
true, если элемент в данный момент перетаскивается.Пример использования данных элемента в обработчике события перетаскивания:
grid.on('dragStart', function(item) {
const data = item.getData();
console.log('Начало перетаскивания элемента:', data);
});
Здесь через item.getData() можно получить любые
произвольные данные, которые были сохранены при создании элемента.
При добавлении элементов в сетку через метод add можно
сразу передать объект данных:
grid.add([
{
element: document.getElementById('item1'),
id: 1,
content: 'Пример элемента'
},
{
element: document.getElementById('item2'),
id: 2,
content: 'Еще один элемент'
}
]);
Для хранения этих данных в элементе используется метод
setData:
const item = grid.getItem(element);
item.setData({
id: 123,
type: 'image',
meta: { author: 'John Doe' }
});
После этого все обработчики, связанные с этим элементом, смогут
использовать переданные данные через item.getData().
Иногда требуется, чтобы обработчик получал не только
item и event, но и дополнительные параметры из
внешнего контекста. В этом случае удобно использовать
замыкания:
function createHandler(customParam) {
return function(item, event) {
console.log('Пользовательский параметр:', customParam);
console.log('Элемент:', item.getData());
};
}
grid.on('dragReleaseEnd', createHandler('Секретная информация'));
Такой подход позволяет динамически передавать любые данные внутрь обработчиков без изменения API Muuri.
Для событий фильтрации (filter) и сортировки
(sort) Muuri передает массив элементов и контекст
действия:
grid.on('filter', function(items, filter) {
console.log('Элементы после фильтрации:', items.map(i => i.getData()));
console.log('Использованный фильтр:', filter);
});
grid.on('sort', function(items, sortBy) {
console.log('Элементы после сортировки:', items.map(i => i.getData()));
console.log('Критерий сортировки:', sortBy);
});
items — массив объектов Muuri.Item,
прошедших фильтр или отсортированных.filter / sortBy — параметр, который был
передан в метод filter или sort.Это позволяет строить динамические интерфейсы, реагирующие на состояние сетки и при этом сохранять привязку к бизнес-данным элемента.
add
или setData.on.item.getData() в
обработчике для доступа к контекстной информации.Эта структура позволяет интегрировать Muuri в сложные приложения, где каждый элемент содержит метаданные, используемые в UI и логике приложения.
События перетаскивания (drag) в Muuri особенно удобны для передачи данных, так как они происходят на уровне отдельных элементов:
dragStart(item, event) — момент начала перетаскивания,
можно блокировать перетаскивание по условию.dragMove(item, event) — текущие координаты и состояние
элемента во время движения.dragReleaseStart(item, event) — перед отпусканием
элемента, можно добавить анимации.dragReleaseEnd(item, event) — элемент окончательно
закреплен, данные можно сохранять в базе.Пример передачи данных и реакции на перемещение элемента:
grid.on('dragReleaseEnd', function(item) {
const data = item.getData();
console.log(`Элемент ${data.id} перемещен на новую позицию ${item.getIndex()}`);
});
Этот подход обеспечивает полную синхронизацию пользовательского интерфейса и состояния данных элементов сетки.
Для интеграции с серверной частью данные можно извлекать из
item.getData() и отправлять через AJAX или WebSocket. Это
гарантирует, что позиция и состояние элементов Muuri всегда
соответствуют актуальному состоянию базы данных.
grid.on('dragReleaseEnd', function(item) {
const data = item.getData();
fetch('/update-position', {
method: 'POST',
body: JSON.stringify({ id: data.id, newIndex: item.getIndex() }),
headers: { 'Content-Type': 'application/json' }
});
});
Такой паттерн передачи данных позволяет строить сложные интерактивные интерфейсы с динамическими сетками, где каждый элемент связан с уникальной информацией и реагирует на действия пользователя.