我一直在使用Webassembly在客户端上使用Blazor。但是我认为我现在应该尝试服务器端版本,我有一个简单的想法想尝试一下。
所以我的理解是Blazor服务器端使用SignalR来“推送”更改,以便客户端重新呈现其页面的一部分。
我想尝试的是将数据绑定到单例服务上的属性,如下所示:
@page "/counter"
@inject DataService dataService
<h1>Counter</h1>
<p>Current count: @currentCount ok</p>
<p> @dataService.MyProperty </p>
<p>
@dataService.Id
</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
int currentCount = 0;
void IncrementCount()
{
currentCount++;
dataService.MyProperty += "--o--|";
}
}
Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSingleton<WeatherForecastService>();
services.AddSingleton<DataService>();
}
服务:
namespace bl1.Services
{
public class DataService
{
public DataService()
{
this.Id = System.Guid.NewGuid().ToString();
}
public string Id {get;set;}
public string MyProperty { get; set; }
}
}
所以我的问题是这个。为什么,如果我在两个选项卡中打开此页面,当我在另一个选项卡中的一个选项卡中更改属性的值时,我没有立即看到使用SignalR更新的属性 MyProperty 的值?是否有不应该使用的原因,或者我只是做错了?
我认为在服务器端使用Blazor的好处是,您可以轻松使用SignalR可用这一事实,并在服务器上的值更改时获得实时更新。
我确实从另一个选项卡中的单例服务中获得了最新的价值,但是只有在单击那里的按钮之后。