【问题标题】:How to know when EventCallback has been fired?如何知道 EventCallback 何时被触发?
【发布时间】:2020-06-24 01:34:46
【问题描述】:

我正在使用 razor 组件进行一些测试,但在将属性从子组件更新到祖父组件时遇到问题。

当子组件更新属性时,我正在使用 EventCallback 更新我的父组件。它适用于具有两个级别(ParentComponent/ChildComponent)的架构,但是它不适用于三个级别(GrandParentComponent/ParentComponent/ChildComponent)。

让我们以 A、B 和 C 三个组件为例。

- A (GrandParentComponent)
-- B (ParentComponent)
--- C (ChildComponent)
  • 更新 B 将触发 EventCallback 以更新 A
  • 更新 C 会触发 EventCallback 来更新 B,但是在这个阶段 B 不会触发 EventCallback 一次更新,所以 A 组件仍然没有更新。

如何知道组件是否已被 EventCallback 更新。

我想知道,这样当 C 的 EventCallback 被触发时,我可以从 B 触发 EventCallback。是否有意义? :D

【问题讨论】:

    标签: blazor razor-components


    【解决方案1】:

    如何知道 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);
            }
        }
     }
    

    ComponentC.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 />
    

    注意:您可以使用采用状态模式的通知服务来实现此行为。此服务控制对象的状态、更新、删除等,并定义在操作发生时触发的事件,例如,在组件 A 中添加了一个员工对象,在这种情况下,通知服务通知所有相关方(订阅组件) 这个事实。

    希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 2014-11-03
      • 2023-03-04
      • 2021-05-09
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多