我有一个Blazor服务器端应用程序。它具有所有页面的公共标题。在标头的OnInitialized内部,它检查用户是否有任何新消息。如果是这样,它将闪烁一个图标。该代码当然会在网站加载后执行一次。但是,对于随后的每个导航到不同页面的导航,它将不再执行。
每次用户导航到任何页面时,是否都可以重新执行此操作?我知道我也可以在后台使用计时器来执行此操作,但是想知道它是否仅通过页面导航即可实现?
谢谢!
答案 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个选项应同时在服务器端和客户端起作用。
LocationChanged
事件。您可以在任何可以获得 NavigationManager
参考的地方进行操作。以下组件通过预订NavigationManager.LocationChanged来处理位置更改事件。
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上运行,因此您需要更改元素。