diff --git a/assets/components/InfiniteLoader.vue b/assets/components/InfiniteLoader.vue index 285e3c55..96133564 100644 --- a/assets/components/InfiniteLoader.vue +++ b/assets/components/InfiniteLoader.vue @@ -31,6 +31,8 @@ export default { ); intersectionObserver.observe(this.$refs.observer); + + this.$once("hook:beforeDestroy", () => intersectionObserver.disconnect()); }, }; diff --git a/assets/components/LogEventSource.spec.js b/assets/components/LogEventSource.spec.js index 571eab6d..7e0981f8 100644 --- a/assets/components/LogEventSource.spec.js +++ b/assets/components/LogEventSource.spec.js @@ -19,10 +19,10 @@ describe("", () => { global.EventSource = EventSource; window.scrollTo = jest.fn(); const observe = jest.fn(); - const unobserve = jest.fn(); + const disconnect = jest.fn(); global.IntersectionObserver = jest.fn(() => ({ observe, - unobserve, + disconnect, })); debounce.mockClear(); }); diff --git a/assets/components/ScrollableView.vue b/assets/components/ScrollableView.vue index f9d7edac..9cac0cad 100644 --- a/assets/components/ScrollableView.vue +++ b/assets/components/ScrollableView.vue @@ -44,20 +44,22 @@ export default { }, mounted() { const { content } = this.$refs; - new MutationObserver((e) => { + const mutationObserver = new MutationObserver((e) => { if (!this.paused) { this.scrollToBottom("instant"); } else { this.hasMore = true; } - }).observe(content, { childList: true, subtree: true }); + }); + mutationObserver.observe(content, { childList: true, subtree: true }); + this.$once("hook:beforeDestroy", () => mutationObserver.disconnect()); const intersectionObserver = new IntersectionObserver( (entries) => (this.paused = entries[0].intersectionRatio == 0), { threshholds: [0, 1], rootMargin: "80px 0px" } ); - intersectionObserver.observe(this.$refs.scrollObserver); + this.$once("hook:beforeDestroy", () => intersectionObserver.disconnect()); }, methods: {