Przeglądaj źródła

introduce element.delete() to perform cleanup

Falko Schindler 2 lat temu
rodzic
commit
51e6cd3058

+ 6 - 0
nicegui/element.py

@@ -194,6 +194,12 @@ class Element(ABC, Visibility):
             slot.children[:] = [e for e in slot.children if e.id != element.id]
         self.update()
 
+    def delete(self) -> None:
+        """Called when the corresponding client is deleted.
+
+        Can be overridden to perform cleanup.
+        """
+
 
 def _split(text: str, separator: str) -> Tuple[str, str]:
     words = text.split(separator, 1)

+ 5 - 0
nicegui/elements/scene.py

@@ -1,6 +1,7 @@
 from dataclasses import dataclass
 from typing import Callable, Dict, List, Optional, Union
 
+from .. import binding
 from ..dependencies import register_component
 from ..element import Element
 from ..events import SceneClickEventArguments, SceneClickHit, handle_event
@@ -127,3 +128,7 @@ class Scene(Element):
                         self.camera.x, self.camera.y, self.camera.z,
                         self.camera.look_at_x, self.camera.look_at_y, self.camera.look_at_z,
                         self.camera.up_x, self.camera.up_y, self.camera.up_z, duration)
+
+    def delete(self) -> None:
+        binding.remove(list(self.objects.values()), Object3D)
+        super().delete()

+ 4 - 1
nicegui/elements/upload.py

@@ -42,7 +42,10 @@ class Upload(Element):
                 )
                 handle_event(on_upload, args)
             return {'upload': 'success'}
-        self.client.on_disconnect(lambda: self.client.shared or app.remove_route(self._props['url']))
 
     def reset(self) -> None:
         self.run_method('reset')
+
+    def delete(self) -> None:
+        app.remove_route(self._props['url'])
+        super().delete()

+ 2 - 0
nicegui/nicegui.py

@@ -167,4 +167,6 @@ async def prune_slot_stacks() -> None:
 
 def delete_client(id: str) -> None:
     binding.remove(list(globals.clients[id].elements.values()), Element)
+    for element in globals.clients[id].elements.values():
+        element.delete()
     del globals.clients[id]