Преглед на файлове

raise error if there is no parent view

Falko Schindler преди 2 години
родител
ревизия
b0c995c83c
променени са 3 файла, в които са добавени 13 реда и са изтрити 12 реда
  1. 2 2
      nicegui/elements/element.py
  2. 0 1
      nicegui/globals.py
  3. 11 9
      nicegui/page.py

+ 2 - 2
nicegui/elements/element.py

@@ -6,7 +6,7 @@ import justpy as jp
 
 from .. import globals
 from ..binding import BindableProperty, bind_from, bind_to
-from ..page import Page, get_current_view
+from ..page import Page, find_parent_view
 from ..task_logger import create_task
 
 
@@ -19,7 +19,7 @@ class Element:
     visible = BindableProperty(on_change=_handle_visibility_change)
 
     def __init__(self, view: jp.HTMLBaseComponent):
-        self.parent_view = get_current_view()
+        self.parent_view = find_parent_view()
         self.parent_view.add(view)
         self.view = view
         assert len(self.parent_view.pages) == 1

+ 0 - 1
nicegui/globals.py

@@ -25,7 +25,6 @@ connect_handlers: List[Union[Callable, Awaitable]] = []
 disconnect_handlers: List[Union[Callable, Awaitable]] = []
 startup_handlers: List[Union[Callable, Awaitable]] = []
 shutdown_handlers: List[Union[Callable, Awaitable]] = []
-has_auto_index_page: bool = False
 
 
 def find_route(function: Callable) -> str:

+ 11 - 9
nicegui/page.py

@@ -129,22 +129,22 @@ class Page(jp.QuasarPage):
 
 
 def add_head_html(self, html: str) -> None:
-    for page in get_current_view().pages.values():
+    for page in find_parent_view().pages.values():
         page.head_html += html
 
 
 def add_body_html(self, html: str) -> None:
-    for page in get_current_view().pages.values():
+    for page in find_parent_view().pages.values():
         page.body_html += html
 
 
 async def run_javascript(self, code: str) -> None:
-    for page in get_current_view().pages.values():
+    for page in find_parent_view().pages.values():
         await page.run_javascript(code)
 
 
 async def await_javascript(self, code: str, *, check_interval: float = 0.01, timeout: float = 1.0) -> None:
-    for page in get_current_view().pages.values():
+    for page in find_parent_view().pages.values():
         return await page.await_javascript(code)
 
 
@@ -202,11 +202,12 @@ def page(self,
     return decorator
 
 
-def get_current_view() -> jp.HTMLBaseComponent:
+def find_parent_view() -> jp.HTMLBaseComponent:
     if not globals.view_stack:
+        if globals.loop and globals.loop.is_running():
+            raise RuntimeError('cannot find parent view, view stack is empty')
         page = Page(shared=True)
         globals.view_stack.append(page.view)
-        globals.has_auto_index_page = True  # NOTE: this automatically created page will get some attributes at startup
         jp.Route('/', page._route_function)
     return globals.view_stack[-1]
 
@@ -225,13 +226,14 @@ def error404() -> jp.QuasarPage:
 
 
 def init_auto_index_page() -> None:
-    if not globals.has_auto_index_page:
-        return
-    page: Page = get_current_view().pages[0]
+    if not globals.view_stack:
+        return  # there is no auto-index page on the view stack
+    page: Page = globals.view_stack.pop().pages[0]
     page.title = globals.config.title
     page.favicon = globals.config.favicon
     page.dark = globals.config.dark
     page.view.classes = globals.config.main_page_classes
+    assert len(globals.view_stack) == 0
 
 
 def create_page_routes() -> None: