如何从Blazor中的组件获取singleton中的更新属性?

如何从Blazor中的组件获取singleton中的更新属性?,blazor,blazor-client-side,Blazor,Blazor Client Side,我刚刚更改了默认的Blazor示例来说明这个问题 MainLayout.razor(这是页面顶部,刚刚替换了即将显示计数器的页面) 这是几次按下增量按钮后的结果: 因此,页面本身可以在每次更改时显示当前值,但是页面顶部的组件不能。它只是显示默认值10 这也是我的程序 using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.Extensions.Configuration; using Microsof

我刚刚更改了默认的Blazor示例来说明这个问题

MainLayout.razor(这是页面顶部,刚刚替换了即将显示计数器的页面)

这是几次按下增量按钮后的结果:

因此,页面本身可以在每次更改时显示当前值,但是页面顶部的组件不能。它只是显示默认值10

这也是我的程序

using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using TestBlazor.Classes;

namespace TestBlazor
{
  public class Program
  {
    public static async Task Main(string[] args)
    {
        var builder = WebAssemblyHostBuilder.CreateDefault(args);
        builder.RootComponents.Add<App>("app");

        builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
        builder.Services.AddSingleton<TestClass>();

        await builder.Build().RunAsync();
    }
  }
}
使用Microsoft.AspNetCore.Components.WebAssembly.Hosting;
使用Microsoft.Extensions.Configuration;
使用Microsoft.Extensions.DependencyInjection;
使用Microsoft.Extensions.Logging;
使用制度;
使用System.Collections.Generic;
使用System.Net.Http;
使用系统文本;
使用System.Threading.Tasks;
使用TestBlazor.class;
命名空间TestBlazor
{
公共课程
{
公共静态异步任务主(字符串[]args)
{
var builder=WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add(“应用程序”);
addScope(sp=>newHttpClient{BaseAddress=newURI(builder.HostenEnvironment.BaseAddress)});
builder.Services.AddSingleton();
等待builder.Build().RunAsync();
}
}
}

使用Core5

您需要通知MainLayout组件其状态已更改,并且他应该重新渲染。这可以通过定义每当计数器变量递增时执行的事件委托来实现:

TestClass.cs 将此代码添加到MainLayout页面

@code{
    protected override void OnInitialized()
    {
        testClass.Notify += () => InvokeAsync(StateHasChanged);

        base.OnInitialized();
    }
}

您还必须实现
IDisposable

既然TestClass是单例,我们就不能使用绑定吗?它与服务的范围无关,这是从服务到组件的单向绑定,但您需要通知MainLaout她应该重新呈现。在另一个示例中,您可以创建双向绑定,或者在TestClass中定义一个事件,该事件包含可以传递给订阅者的数据。@yasseros,请参见:谢谢!是的,它很管用。我在其他地方读过这个解决方案,但我认为它可以有一个更直接的方法。无论如何谢谢你!
namespace TestBlazor.Classes
{
   public class TestClass
    {
     public int Counter { get; set; } = 10;
     public void Increment() {
        Counter++;
     }
 }
}
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using TestBlazor.Classes;

namespace TestBlazor
{
  public class Program
  {
    public static async Task Main(string[] args)
    {
        var builder = WebAssemblyHostBuilder.CreateDefault(args);
        builder.RootComponents.Add<App>("app");

        builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
        builder.Services.AddSingleton<TestClass>();

        await builder.Build().RunAsync();
    }
  }
}
public class TestClass
    {
        public int Counter { get; set; } = 10;
        public void Increment()
        {
            Counter++;
            Notify?.Invoke();
        }
        public event Action Notify;
    }
@code{
    protected override void OnInitialized()
    {
        testClass.Notify += () => InvokeAsync(StateHasChanged);

        base.OnInitialized();
    }
}