From f04da6e2788ad76a3db1dc14daa524af1c5a6b02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BE=9D=E7=91=AA=E8=B2=93?= Date: Mon, 9 Mar 2026 20:53:25 +0800 Subject: [PATCH] Fix memory leaks from Cytoscape instances not returned/destroyed Co-Authored-By: Claude Opus 4.6 --- src/components/Discover/Conformance/MoreModal.vue | 10 ++++++++-- src/components/Discover/Map/Filter/TraceFilter.vue | 10 ++++++++-- src/components/Discover/Map/SidebarTraces.vue | 10 ++++++++-- src/module/cytoscapeMapTrace.js | 1 + 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/components/Discover/Conformance/MoreModal.vue b/src/components/Discover/Conformance/MoreModal.vue index 7617523..4dcfe4e 100644 --- a/src/components/Discover/Conformance/MoreModal.vue +++ b/src/components/Discover/Conformance/MoreModal.vue @@ -121,7 +121,7 @@ * results with expandable activity sequences. */ -import { ref, computed, watch, nextTick, useTemplateRef } from "vue"; +import { ref, computed, watch, nextTick, useTemplateRef, onBeforeUnmount } from "vue"; import { storeToRefs } from "pinia"; import { useConformanceStore } from "@/stores/conformance"; import cytoscapeMapTrace from "@/module/cytoscapeMapTrace.js"; @@ -151,6 +151,7 @@ const infiniteData = ref(null); const maxItems = ref(false); const infiniteFinish = ref(true); // Whether infinite scroll loading is complete const startNum = ref(0); +const cyTraceInstance = ref(null); const processMap = ref({ nodes: [], edges: [], @@ -364,8 +365,9 @@ function createCy() { setNodesData(); setEdgesData(); + cyTraceInstance.value?.destroy(); if (graphId !== null) - cytoscapeMapTrace( + cyTraceInstance.value = cytoscapeMapTrace( processMap.value.nodes, processMap.value.edges, graphId, @@ -409,6 +411,10 @@ function handleScroll(event) { if (overScrollHeight) fetchData(); } + +onBeforeUnmount(() => { + cyTraceInstance.value?.destroy(); +});