4

尝试使用最新模板生成的解决方案。

  • 拥有一个服务来保存字符串列表。
  • 在 MainLayout.razor 和 NavMenu.razor 中注入服务
  • 该服务具有简单的方法,即添加、删除、项目
  • 在 MainLayout 中,使用 OnInitializedAsync() 添加一些项目,如下所示

.

protected override async Task OnInitializedAsync()
    {
        await Task.Run(() =>
        {
            this.svc.Add("string one");
            this.svc.Add("string two");
        });
         await Task.Run(() => StateHasChanged());
    }
  • 在 NavMenu.razor 的 html 片段中,我很简单地尝试打印

    @svc.Items.Count

  • 使用上面的代码,我没有看到计数得到更新/刷新,我也可以在 MainLayout 中有另一个按钮处理程序来调用 svc.Add 方法,但计数没有得到更新。

  • 只有当我尝试在 navMenu.razor 中有一些 btn 处理程序时,blazor 才会重新呈现自身

<button @onclick="SetCurrentTime"> Time </button>
    <h4>@time</h4>
        
    void SetCurrentTime()
            {
                time = DateTime.Now.ToLongTimeString();
            }

这个问题的github repo:(点击AddString并且计数器应该增加)https://github.com/pkaushik23/mycodeshares/tree/master/CheckRefreshBlazor

在此处输入图像描述

4

1 回答 1

4

NameService应该通知更改。在外部调用组件方法以更新状态了解它

对于您的服务代码,例如:

public class StringService
{
    public event Func<string, Task> Notify;
    public List<string> Names { get; set; } = new List<string>();
    public void Add(string s)
    {
        this.Names.Add(s);
        if (Notify != null)
        {
            await Notify.Invoke(s);
        }            
    }
}

在您的组件上:

protected override void OnInitialized()
{
    this.svc.Notify += OnNotify;
}

public async Task OnNotify(string s)
{
    await InvokeAsync(() =>
    {            
        StateHasChanged();
    });
}
于 2019-09-22T20:52:46.303 回答