Экземпляр ScrollMagic.Controller управляет всеми сценами
(Scene), связанными с прокруткой страницы. В процессе
работы приложения контроллер накапливает внутренние ссылки, обработчики
событий и данные о сценах. При динамическом изменении интерфейса (SPA,
повторная инициализация компонентов, переходы между страницами)
требуется корректно освобождать ресурсы, чтобы избежать утечек памяти и
конфликтов поведения.
Уничтожение контроллера — это процесс полного отключения всех связанных сцен, удаления обработчиков событий и очистки внутренних структур.
destroy()Основной способ уничтожения контроллера — вызов метода:
controller.destroy(resetScenes);
resetScenestrue — все сцены будут сброшены в исходное
состояниеfalse — сцены сохранят текущее состояниеПример:
controller.destroy(true);
При вызове destroy() происходит:
Если указан resetScenes = true, дополнительно:
pin)destroy(true) и destroy(false)destroy(true)Используется, когда необходимо полностью очистить всё поведение:
destroy(false)Применяется, если требуется:
Однако:
Хотя controller.destroy() автоматически обрабатывает
сцены, в сложных случаях рекомендуется вручную уничтожать сцены:
scene.destroy(true);
controller.destroy(true);
Причины:
После уничтожения возможно создание нового контроллера:
controller = new ScrollMagic.Controller();
Важно учитывать:
SceneВ одностраничных приложениях уничтожение контроллера — обязательная практика при смене маршрутов.
Типичный сценарий:
function initScrollMagic() {
controller = new ScrollMagic.Controller();
scene = new ScrollMagic.Scene({ triggerElement: "#trigger" })
.setClassToggle("#animate", "active")
.addTo(controller);
}
function destroyScrollMagic() {
if (controller) {
controller.destroy(true);
controller = null;
}
}
Если контроллер не уничтожается:
Это приводит к:
Правильное уничтожение устраняет эти проблемы.
Если используются плагины (например, GSAP-анимации):
destroy(true) не всегда полностью удаляет сторонние
эффектыПример с GSAP:
scene.destroy(true);
TweenMax.killTweensOf(element);
После уничтожения контроллер не должен использоваться:
if (!controller) {
// безопасно создать новый
}
Повторное использование уничтоженного экземпляра может привести к ошибкам.
1. Повторный вызов destroy()
controller.destroy();
controller.destroy(); // ошибка или непредсказуемое поведение
2. Использование сцен после уничтожения
controller.destroy();
scene.addTo(controller); // некорректно
3. Игнорирование resetScenes
controller.destroy(false);
Может привести к зависшим стилям и классам.
При уничтожении с resetScenes = true:
setClassToggleЕсли false:
destroy(true) при удалении
контроллераПризнаки неправильного уничтожения:
pin)Отладка:
console.log(controller);
После уничтожения:
controller === null // должно быть true
Метод destroy():
_sceneObjectsscroll и resizeЭто делает объект контроллера непригодным для дальнейшего использования.
Корректная схема работы:
Нарушение этой последовательности часто приводит к трудноуловимым багам.