Метод once используется для однократной подписки на
событие внутри библиотеки Masonry. Он позволяет выполнить обработчик
только один раз, после чего подписка автоматически удаляется. Такой
подход особенно полезен при работе с жизненным циклом сетки:
инициализации, завершении перерасчёта элементов, загрузке изображений
или других событиях, которые должны обрабатываться единственный раз.
Внутри Masonry система событий реализована на базе библиотеки
EvEmitter, которая обеспечивает простую модель
подписки, отписки и вызова обработчиков. Метод once
является частью этой системы.
Главная задача once — зарегистрировать обработчик
события, который выполнится ровно один раз. После
первого вызова обработчик автоматически удаляется из списка
слушателей.
Это избавляет от необходимости вручную отписываться от события после его выполнения.
Основные сценарии использования:
layoutComplete);msnry.once( eventName, listener )
eventName
Строка с названием события Masonry.
Примеры событий:
layoutCompleteremoveCompleteappendCompletelistener
Функция-обработчик события, которая будет вызвана только один раз.
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200
});
msnry.once('layoutComplete', function(items) {
console.log('Первый layout завершён');
});
В этом примере:
Если сетка будет перерасчитана повторно, обработчик больше не сработает.
once от
onСистема событий Masonry содержит два основных метода подписки:
| Метод | Поведение |
|---|---|
on |
обработчик вызывается каждый раз, когда происходит событие |
once |
обработчик вызывается только один раз |
onmsnry.on('layoutComplete', function() {
console.log('layout выполнен');
});
При каждом перерасчёте сетки сообщение будет выводиться снова.
oncemsnry.once('layoutComplete', function() {
console.log('layout выполнен один раз');
});
Сообщение появится только при первом завершении layout.
Метод once реализуется через внутренний механизм обёртки
обработчика.
Алгоритм работы:
Упрощённая схема реализации:
once(eventName, listener) {
function onceListener() {
listener.apply(this, arguments);
this.off(eventName, onceListener);
}
this.on(eventName, onceListener);
}
Таким образом:
layoutCompleteСобытие layoutComplete является одним из самых часто
используемых событий Masonry. Оно срабатывает после завершения
вычисления позиций всех элементов сетки.
Пример однократной реакции на завершение layout:
msnry.once('layoutComplete', function(items) {
console.log('Количество элементов:', items.length);
});
Аргумент items содержит массив объектов Masonry,
представляющих элементы сетки.
При добавлении элементов через append или
appended может потребоваться выполнить действие только
после первой вставки элементов.
msnry.once('appendComplete', function(items) {
console.log('Первые элементы добавлены');
});
После добавления последующих элементов обработчик уже не будет вызываться.
В сложных интерфейсах Masonry может выступать зависимостью для других компонентов. Например, галереи изображений или анимационных библиотек.
Однократная подписка позволяет выполнить код только после первой готовности сетки.
msnry.once('layoutComplete', function() {
initLightbox();
});
Это гарантирует, что сторонний компонент инициализируется после расчёта позиций элементов.
imagesLoadedЧасто Masonry используется вместе с библиотекой
imagesLoaded, чтобы корректно вычислить размеры элементов
после загрузки изображений.
В таком случае once применяется для запуска layout
только после первого события загрузки.
imagesLoaded(grid).once('always', function() {
msnry.layout();
});
Такой подход предотвращает повторный запуск layout на каждое изображение.
Некоторые события Masonry передают данные в обработчик.
Например:
msnry.once('removeComplete', function(items) {
console.log('Удалено элементов:', items.length);
});
Параметр items представляет массив удалённых
элементов.
Метод once поддерживает современные синтаксические
возможности JavaScript.
msnry.once('layoutComplete', (items) => {
console.log('layout завершён', items);
});
Однако важно учитывать особенности контекста this. В
стрелочных функциях он не привязывается к экземпляру Masonry.
Если требуется доступ к экземпляру через this, следует
использовать обычную функцию.
msnry.once('layoutComplete', function() {
console.log(this);
});
once и
offНесмотря на автоматическую отписку, once можно отменить
вручную до момента выполнения.
function handler() {
console.log('выполнится один раз');
}
msnry.once('layoutComplete', handler);
msnry.off('layoutComplete', handler);
После вызова off обработчик не будет выполнен.
msnry.once('layoutcomplete', handler);
События чувствительны к регистру. Правильное название:
layoutComplete
Если событие уже произошло, once не вызовет
обработчик.
Например:
msnry.layout();
msnry.once('layoutComplete', handler);
В этом случае обработчик может не выполниться.
Каждый вызов once создаёт новый обработчик.
msnry.once('layoutComplete', handler);
msnry.once('layoutComplete', handler);
В результате функция будет выполнена два раза, но каждая подписка — только один раз.
Частая задача — скрыть loader после первой раскладки.
var loader = document.querySelector('.loader');
msnry.once('layoutComplete', function() {
loader.style.display = 'none';
});
Алгоритм:
layoutComplete происходит;Повторные пересчёты сетки не вызывают обработчик.
once
в архитектуре событий MasonryМетод once обеспечивает:
В крупных приложениях это особенно важно, поскольку количество событий может быстро расти.
Однократные подписки позволяют точно контролировать жизненный цикл интерфейса и избегать избыточных обработчиков.