如何从Blazor中的组件获取singleton中的更新属性?
我刚刚更改了默认的Blazor示例来说明这个问题 MainLayout.razor(这是页面顶部,刚刚替换了即将显示计数器的页面) 这是几次按下增量按钮后的结果: 因此,页面本身可以在每次更改时显示当前值,但是页面顶部的组件不能。它只是显示默认值10 这也是我的程序如何从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
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();
}
}