(Blazor-LayoutComponentBase)检测@Body lifecycle完成以在布局中加载页面

(Blazor-LayoutComponentBase)检测@Body lifecycle完成以在布局中加载页面,layout,parent-child,blazor,loading,lifecycle,Layout,Parent Child,Blazor,Loading,Lifecycle,因此,我在Blazor中设置了一个自定义布局,就像站点的母版页一样。其中一项功能是一些异步初始化,为该页面运行一些要求更高、更耗时的方法。在此加载过程中,页面内容将被隐藏,加载栏将闪烁。处理完成后,布尔值将翻转,从而显示内容 我计划将所有这些代码从单个页面移到布局上。布局在许多网站上都有使用,因此这也将把功能引入到以前没有的其他网站上。它还将功能集中在一个地方,而不是使用布局在页面上复制 因此,守则: 布局,剃刀 其思想是检测@Body何时完成了其生命周期,然后将IsInitialized设置为

因此,我在Blazor中设置了一个自定义布局,就像站点的母版页一样。其中一项功能是一些异步初始化,为该页面运行一些要求更高、更耗时的方法。在此加载过程中,页面内容将被隐藏,加载栏将闪烁。处理完成后,布尔值将翻转,从而显示内容

我计划将所有这些代码从单个页面移到布局上。布局在许多网站上都有使用,因此这也将把功能引入到以前没有的其他网站上。它还将功能集中在一个地方,而不是使用布局在页面上复制

因此,守则:

布局,剃刀

其思想是检测@Body何时完成了其生命周期,然后将IsInitialized设置为true

我遇到的问题是,当主体片段完成所有任务并且页面准备就绪时,试图从主体片段中获取信息

这在以前很简单,特别是在页面上,我可以访问阻止页面加载的方法,并在完成后设置初始化。但是,现在,我没有这些特定于页面的方法来实现站点布局中现在需要的通用功能

期望的结果类似于:

protected override Task OnInitializedAsync() {
    return Task.Run(() => {
        Body.LifecylcleCompleted();
        IsInitialised = true;
    });
}
我们非常感谢您的所有想法,当然也感谢您抽出时间

PS:我已经意识到这种结构的一些问题是OnInitializedAsync只运行一次,似乎不适合更改页面和加载栏。 此外,我计划尝试只在if检查中包装@Body,这样在所有页面上通常是静态的页眉和页脚在它们之间发生加载动画。
在尝试这些修改之前,我计划先让所有的功能都正常工作。

您是否考虑过使用“服务”,比如说“InitializeService”?服务被注入到页面中,它们添加特定的初始化任务。LayoutComponent使用相同的服务并执行任务。一旦所有任务完成(
等待initializeService.LifeCycleCleCompleted()
)您设置了“`IsInitialized=true``我还没有测试过它,这只是个想法。我认为LayoutComponent的
OnInitializedAsync
方法将在PageComponent的
OnInitializedAsync
方法之前被调用。在这种情况下,服务中编写的经典事件可能会有所帮助。如果您想看一些代码来更好地解释它,请告诉我。@Benno谢谢,我现在来看一看,看看可以使用什么样的服务来实现这一点。如果您想看一种示例,请告诉我。您是否想过使用“服务”,比如说“InitializeService”?服务被注入到页面中,它们添加特定的初始化任务。LayoutComponent使用相同的服务并执行任务。一旦所有任务完成(
等待initializeService.LifeCycleCleCompleted()
)您设置了“`IsInitialized=true``我还没有测试过它,这只是个想法。我认为LayoutComponent的
OnInitializedAsync
方法将在PageComponent的
OnInitializedAsync
方法之前被调用。在这种情况下,服务中编写的经典事件可能会有所帮助。如果您想看一些代码来更好地解释它,请告诉我。@Benno谢谢,我现在来看一看,看看可以鼓动什么样的服务来实现这一点。如果您想看一种示例,请告诉我。
protected override Task OnInitializedAsync() {
    return Task.Run(() => {
        Thread.Sleep(5000); //Represents a long process for a page launch.
        IsInitialised = true;
    });
}
protected override Task OnInitializedAsync() {
    return Task.Run(() => {
        Body.LifecylcleCompleted();
        IsInitialised = true;
    });
}