Реализация подписки на события с помощью приложения Blazor ClientSide - PullRequest
0 голосов
/ 24 сентября 2019

Наше приложение Blazor работает на preview9.

Я пытаюсь реализовать компонент .razor, который прослушивает событие из службы NotificationService, которую мы написали, чтобы обновить представление при каждом вызове службы,но я, кажется, что-то упускаю;

У меня есть интерфейс службы (для краткости сокращен);

public interface INotificationService
{
    event Action OnChange;
    Task<ServiceResponse<Notification>> AddNotificationAsync(Notification notification);
}

, и в моей реализации я вызываю событие OnChange (снова сокращено для краткости));

public async Task<ServiceResponse<Notification>> AddNotificationAsync(Notification notification)
{
    /*...*/

    StateChanged();
}

Где StateChanged() есть;

public event Action OnChange;

private void StateChanged() => OnChange?.Invoke();

В моем Blazor.Client я разрешил INotificationService в ConfigureServices следующим образом;

services.AddScoped<INotificationService, NotificationService>();

Затем я внедряю службу в компонент, который я хочу подписать на событие OnChange();

 @inject INotificationService NotificationService

 protected override async Task OnInitializedAsync()
 {
     NotificationService.OnChange += StateHasChanged;
 }

А затем на другой моей странице razor я снова внедряю ту же службу и вызываю AddNotificationAsync method;

@inject INotificationService NotificationService

  await NotificationService.AddNotificationAsync(
                            new Notification { 
                                Level = NotificationLevel.Success, 
                                Text = $"Agreement Type with Id = {agreementType.Id} has been successfully added.".ToString()
                            });

Однако вызов t NotificationService.AddNotificationAsync не вызывает OnChange, а затем StateHasChanged компонента, так как компонент не обновляется?Есть идеи, что я делаю не так, пожалуйста?

1 Ответ

2 голосов
/ 24 сентября 2019

В соответствии с документами Microsoft Для вызова состояния компонента извне вызывать методы компонента , вам необходимо изменить:

 @inject INotificationService NotificationService

 protected override async Task OnInitializedAsync()
 {
     NotificationService.OnChange += StateHasChanged;
 }

By:

 @inject INotificationService NotificationService

 protected override async Task OnInitializedAsync()
 {
     NotificationService.OnChange += OnNotify;
 }


 public async Task OnNotify()
 {
    await InvokeAsync(() =>
    {
        StateHasChanged();
    });
 }

В своем коде вывызывают метод StateHasChanged компонента вне SynchronizationContext Blazor.

InvokeAsync используется для переключения на правильный контекст и постановки в очередь рендеринга.

...