компонент блазор не обновляется |core3.0 - PullRequest
1 голос
/ 22 сентября 2019

Попытка использовать решение, сгенерированное последними шаблонами.

  • Наличие службы, которая хранит список строк.
  • внедрение службы в MainLayout.razor и NavMenu.razor
  • У службы есть простые методы: Add, Remove, Items
  • . В MainLayout с помощью OnInitializedAsync () добавляются некоторые элементы, такие как

.

protected override async Task OnInitializedAsync()
    {
        await Task.Run(() =>
        {
            this.svc.Add("string one");
            this.svc.Add("string two");
        });
         await Task.Run(() => StateHasChanged());
    }
  • В html-фрагменте NavMenu.razor я просто пытаюсь напечатать

    @svc.Items.Count

  • С приведенным выше кодом я не вижу обновления счетчика / обновления, я также могу иметь другой обработчик кнопок в MainLayout для вызова метода svc.Add, но счетчик не обновляется.

  • Только только когда я пытаюсь использовать какой-либо обработчик btn в navMenu.razor, блазор перерисовывает себя

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

github-репо для этой проблемы: (нажмите AddString и счетчик должен увеличиваться) https://github.com/pkaushik23/mycodeshares/tree/master/CheckRefreshBlazor

enter image description here

1 Ответ

1 голос
/ 22 сентября 2019

Ваш 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();
    });
}
...