在每个页面导航上执行blazor标头OnInitialized

时间:2020-07-23 12:41:50

标签: blazor blazor-server-side

我有一个Blazor服务器端应用程序。它具有所有页面的公共标题。在标头的OnInitialized内部,它检查用户是否有任何新消息。如果是这样,它将闪烁一个图标。该代码当然会在网站加载后执行一次。但是,对于随后的每个导航到不同页面的导航,它将不再执行。

每次用户导航到任何页面时,是否都可以重新执行此操作?我知道我也可以在后台使用计时器来执行此操作,但是想知道它是否仅通过页面导航即可实现?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果您是服务器端的用户,为什么不接收所有InvokeAsync(StateHasChanged),以防出现新消息。

在您的* .razor代码部分中也是如此:

protected override async Task OnInitializedAsync()
{
    MyBackendService.OnUpdate += OnUpdate;
}

private void OnUpdate()
{
    // May be additional code to load the message - if requred
    InvokeAsync(StateHasChanged);        
}

在新消息到达或创建的BackendService中:

public event Action OnUpdate;
internal void UpdateView() => OnUpdate?.Invoke();

现在,如果有新消息(例如回调视图以重新加载),则可以调用UpdateView()。

答案 1 :(得分:0)

您有2个选项应同时在服务器端和客户端起作用。

  1. 根据Blazor docs,您可以订阅 LocationChanged 事件。您可以在任何可以获得 NavigationManager 参考的地方进行操作。

以下组件通过预订NavigationManager.LocationChanged来处理位置更改事件。

  1. 您可以在 OnAfterRenderAsync 页面上覆盖MainLayout.razor Blazor方法。 由于这是一个共享的布局组件,因此每次App导航时都会呈现。您甚至可以@inject NavigationManager _navigationManager检查要呈现的页面。

选项2的代码示例:

@inject NavigationManager _navigationManager
@code {
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        var url = _navigationManager.Uri;
        //write you code here...
    }
}

选项2可能是最好的使用方式,因为代码将在呈现的UI上运行,因此您需要更改元素。