浏览代码

#1283 fix refreshable with function references

Falko Schindler 1 年之前
父节点
当前提交
0a41810f6b
共有 2 个文件被更改,包括 33 次插入1 次删除
  1. 9 0
      nicegui/functions/refreshable.py
  2. 24 1
      tests/test_refreshable.py

+ 9 - 0
nicegui/functions/refreshable.py

@@ -53,6 +53,15 @@ class refreshable:
         self.instance = instance
         return self
 
+    def __getattribute__(self, __name: str) -> Any:
+        attribute = object.__getattribute__(self, __name)
+        if __name == 'refresh':
+            def refresh(instance=self.instance, *args: Any, **kwargs: Any) -> None:
+                self.instance = instance
+                attribute(*args, **kwargs)
+            return refresh
+        return attribute
+
     def __call__(self, *args: Any, **kwargs: Any) -> Union[None, Awaitable]:
         self.prune()
         target = RefreshableTarget(container=RefreshableContainer(), instance=self.instance, args=args, kwargs=kwargs)

+ 24 - 1
tests/test_refreshable.py

@@ -31,7 +31,7 @@ def test_refreshable(screen: Screen) -> None:
     screen.should_contain('[]')
 
 
-async def test_async_refreshable(screen: Screen) -> None:
+def test_async_refreshable(screen: Screen) -> None:
     numbers = []
 
     @ui.refreshable
@@ -146,3 +146,26 @@ def test_refresh_deleted_element(screen: Screen):
 
     screen.click('Clear')
     screen.click('Refresh')
+
+
+def test_refresh_with_function_reference(screen: Screen):
+    # https://github.com/zauberzeug/nicegui/issues/1283
+    class Test:
+
+        def __init__(self, name):
+            self.name = name
+            self.ui()
+
+        @ui.refreshable
+        def ui(self):
+            ui.notify(f'Refreshing {self.name}')
+            ui.button(self.name, on_click=self.ui.refresh)
+
+    Test('A')
+    Test('B')
+
+    screen.open('/')
+    screen.click('A')
+    screen.should_contain('Refreshing A')
+    screen.click('B')
+    screen.should_contain('Refreshing B')