Как узнать, когда EventCallback был запущен? - PullRequest
0 голосов
/ 12 марта 2020

Я провожу некоторое тестирование с бритвенными компонентами, но у меня есть проблема с обновлением свойства от дочернего компонента до родительского компонента.

Я использую EventCallback для обновления моего родительского компонента, когда дочерний компонент обновляет свойство. Он хорошо работает для архитектуры с двумя уровнями (ParentComponent / ChildComponent), однако не работает с тремя уровнями (GrandParentComponent / ParentComponent / ChildComponent).

Давайте рассмотрим пример с тремя компонентами A, B и * 1017. *.

- A (GrandParentComponent)
-- B (ParentComponent)
--- C (ChildComponent)
  • При обновлении B будет запущен EventCallback для обновления A
  • При обновлении C будет запущен EventCallback для обновления B, однако на этом этапе B не вызывает EventCallback один раз обновлен, поэтому компонент A все еще не обновлен.

Как узнать, был ли компонент обновлен с помощью EventCallback.

Я хотел бы знать, что я могу вызвать EventCallback из B, когда EventCallback из C был запущен. Имеет ли это смысл? : D

1 Ответ

0 голосов
/ 12 марта 2020

Как узнать, когда был запущен EventCallback?

Определить делегат события, который вы можете запустить при срабатывании EventCallback ... просто джокер.

Вы можете сделать это различными способами. Вот один из них:

ComponentA.razor

<ComponentB ComponentBEvent="EventCallback.Factory.Create<string>(this, 
          mymethod)"></ComponentB>
<p>Message from Component A @message</p>

@code {
    private string message;

    private Task mymethod(string str)
   {
       message = str;
       return  Task.CompletedTask;
   }
}

ComponentB.razor

<ComponentC ComponentCEvent="EventCallback.Factory.Create<string>(this, 
                                                     mymethod)"></ComponentC>

<p>Message from Component B @message</p>

@code {
    string myvalue;
    [Parameter]
    public EventCallback<string> ComponentBEvent { get; set; }

    private string message;

    private async Task mymethod(string str)
    {
         message = str;

        if(ComponentBEvent.HasDelegate)
        {
           await ComponentBEvent.InvokeAsync(str);
        }
    }
 }

Компонент C .razor

<input type="text" value="@myvalue" @oninput="@((args) => { myvalue = 
   args.Value.ToString(); ComponentCEvent.InvokeAsync(args.Value.ToString()); 
})" />


<p>Message from Component C @myvalue</p>

@code {
     string myvalue;
     [Parameter]
     public EventCallback<string> ComponentCEvent { get; set; }
}

Использование

<ComponentA />

Примечание. Это поведение можно реализовать с помощью службы уведомлений, в которой используется шаблон состояния. Эта служба контролирует состояние объектов, обновляет, удаляет и т. Д. c. И определяет события, которые запускаются при возникновении действия, например, объект сотрудника был добавлен в компонент A, и в этом случае служба уведомлений уведомляет все заинтересованные стороны. (подписывая компоненты) этого факта.

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...