From 14156554324c61d99f4ddd7fdd4b1174578ac61e Mon Sep 17 00:00:00 2001
From: Iisakki Rotko <iisakki.rotko@gmail.com>
Date: Fri, 22 Nov 2024 11:31:44 +0100
Subject: [PATCH] fix: detach on_msg handler on widget/template close

This improves performance slightly, since we don't have to wait for garbage collection.
---
 ipyvue/VueTemplateWidget.py | 7 +++++++
 ipyvue/VueWidget.py         | 7 +++++++
 2 files changed, 14 insertions(+)

diff --git a/ipyvue/VueTemplateWidget.py b/ipyvue/VueTemplateWidget.py
index 54b00c2..c09930c 100644
--- a/ipyvue/VueTemplateWidget.py
+++ b/ipyvue/VueTemplateWidget.py
@@ -59,6 +59,9 @@ def resolve_ref(value):
             else:
                 getattr(self, "vue_" + event)(data)
 
+    def _clear_event_handler(self):
+        self.on_msg(self._handle_event, remove=True)
+
 
 def _value_to_json(x, obj):
     if inspect.isclass(x):
@@ -164,5 +167,9 @@ def on_ref_source_change(change):
         for traitlet in sync_ref_traitlets:
             create_ref_and_observe(traitlet)
 
+    def close(self):
+        self._clear_event_handler()
+        super().close()
+
 
 __all__ = ["VueTemplate"]
diff --git a/ipyvue/VueWidget.py b/ipyvue/VueWidget.py
index 465f6a7..7562996 100644
--- a/ipyvue/VueWidget.py
+++ b/ipyvue/VueWidget.py
@@ -130,6 +130,9 @@ def _handle_event(self, _, content, buffers):
         data = content.get("data", {})
         self._fire_event(event, data)
 
+    def _clear_event_handler(self):
+        self.on_msg(self._handle_event, remove=True)
+
 
 class VueWidget(DOMWidget, Events):
     # we can drop this when https://github.com/jupyter-widgets/ipywidgets/pull/3592
@@ -192,5 +195,9 @@ def hide(self):
 
         self.class_list.add("d-none")
 
+    def close(self):
+        self._clear_event_handler()
+        super().close()
+
 
 __all__ = ["VueWidget"]