如何在Blazor服务器端更新多个用户?

8
假设我想要一个用户组有同步视图的UI。想象一下一个群聊应用程序,每个组中的所有人都应该看到完全相同的消息。
当用户向组中发布消息时,整个组需要接收该消息。
使用JS,我可以使用SignalR Groups,并使前端生成SignalR事件以发布消息。然后,服务器端Hub将向该组发送该消息。
在服务器端Blazor上,由于所有用户的状态已经在服务器上,我该如何协调更新Blazor上的用户组的UI?

1
也许你可以为每个用户订阅一个事件,当任何用户提交消息时触发该事件,并且该事件将更新各个用户的组件? - Kyle
1个回答

12

我试图实现类似的功能。过了一段时间,我发现了一种方法来做到这一点。Kyle的答案帮助我理清了思路。

你必须创建一个名为Messenger的类,该类具有一个Action属性和一个在调用时触发此Action的方法。

public Action OnMessage { get; set; }
public void AddMessage(string message)
{
  Text = message;
  OnMessage?.Invoke();
}
在 razor 组件中,注入 Messenger。另外,你应该为 OnMessage 属性设置一个事件,然后调用 StateHasChanged 来告诉视图它可以更新。
@inject Messenger messenger
// rest of component here, and then the code block 
protected override async Task OnInitializedAsync()
{
  messenger.OnMessage += () =>
  {
    // do something with the messenger.Text here
    InvokeAsync(this.StateHasChanged);
  };
}
不要忘记,在你的Startup类中,将Messenger类添加为Singleton,以便在注入时可用。

不要忘记,在你的Startup类中,将Messenger类添加为Singleton,以便在注入时可用。

services.AddSingleton<Messenger>();

我希望这就是你尝试实现的内容,它也可以帮助其他人。 干杯。


1
这确实让我有了新的视角,但是它会不会在每次用户打开新电路或重新加载组件时,都向 OnMessage 委托中添加一个新的匿名操作? - Takelovski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接