【问题标题】:Blazor EventCallback with Multiple Params - how to respond to event in parent host control具有多个参数的 Blazor EventCallback - 如何响应父主机控件中的事件
【发布时间】:2021-03-18 21:55:11
【问题描述】:

我有一个带有 EventCallBack 参数的 blazor 组件,它利用了允许多个参数的新结构格式

[Parameter] public EventCallback<(EmployeeShiftDay, DateTime, DateTime)> NewDayScrolledIntoView { get; set; }

eventcallback 在子进程中正常调用

await NewDayScrolledIntoView.InvokeAsync(p1, p2, p3);

在我的主机页面中,我有相应的方法来处理调用

private void NewDayInView(EmployeeShiftDay dayInView, DateTime weekStart, DateTime weekEnd)
{
   ...
}

如何在宿主组件中添加这个 EventCallBack 的标记 - 我当然需要 3 个参数而不仅仅是一个

<ShiftCardScroller NewDayScrolledIntoView="@((args) => NewDayInView(args))" ></ShiftCardScroller>

【问题讨论】:

  • 临时解决方案是使用 @ref 引用父主机中的组件并访问子主机中的公共属性,但更愿意通过 EventCallBack args 发送
  • 你不应该那样做。现在它只是一个警告。将来会出错。
  • 同意一个不好的方法 - 已经像你一样实施了,@Brian Parker 建议谢谢!

标签: blazor webassembly .net-5


【解决方案1】:

您正在解构调用它:

await NewDayScrolledIntoView.InvokeAsync((p1, p2, p3));

收到事件后解构它:

<ShiftCardScroller NewDayScrolledIntoView="@((args)=> NewDayInView(args.Item1,args.Item2,args.Item3))" />

【讨论】:

    【解决方案2】:

    您可以使用以下自定义 Args 类型:

    public class EventCallbackArgs
    {
        public bool Confirm { get; set; }
        public Guid Id { get; set; }
        public string Name { get; set; }
    }
    

    这是一个示例 Blazor 代码

    <button type="button" class="btn btn-danger" @onclick="() => OnConfirmationChange(true)">
        Delete
    </button>
    

    点击删除按钮时,会调用OnConfirmationChange,在OnConfirmationChange的代码中,可以准备EventCallbackArgs并调用ConfirmationChanged

    [Parameter]
    public EventCallback<EventCallbackArgs> ConfirmationChanged { get; set; }
    public EventCallbackArgs args { get; set; }
    
    protected async Task OnConfirmationChange(bool deleteCofirmed)
    {
        ShowConfirmation = false;
        args = new EventCallbackArgs { Id = id, Name = name };
        args.Confirm = deleteCofirmed;
        await ConfirmationChanged.InvokeAsync(args);
    }
    

    【讨论】:

      【解决方案3】:

      对我来说@Brian Parker 的解决方案不起作用,需要稍作修改:

      (相同)

      await NewDayScrolledIntoView.InvokeAsync((p1, p2, p3));
      

      元组转换:

      <ShiftCardScroller NewDayScrolledIntoView="@((args)=> NewDayInView(((EmployeeShiftDay,DateTime,DateTime))args))" />
      

      方法接受一个参数。类型与之前的类型一致:

      private void NewDayInView((EmployeeShiftDay,DateTime,DateTime)args)
      {
         ...
      }
      

      有时需要重新启动 Visual Studio 以消除不相关的错误消息。

      【讨论】:

      • 请解释您的修改,它是如何工作的,在哪些情况下需要它以及为什么。
      • 现在合适还是我应该让它更详细?
      • 我认为更详细会更好,同时使用“因为”、“为了”和“因此”、“否则”等短语......考虑看看How to Answer
      【解决方案4】:

      您应该只将方法的名称传递给子组件

      <ShiftCardScroller NewDayScrolledIntoView="@NewDayInView" ></ShiftCardScroller>
      

      在子组件中,您可以使用所需的参数调用回调

      NewDayScrolledIntoView.invokeAsync(Param1,Param1,Param3)
      

      【讨论】:

      • 感谢您的评论,但这是不允许的 - 正如您提到的那样,我已经在调用但主机控件不会接受“方法组”作为 EventCallBack - 它正在寻找 3 个参数
      • @Laurence73 显然这是不可能的检查这个链接:github.com/dotnet/aspnetcore/issues/23182
      • 根据这个后面的帖子它是!它只是没有显示如何添加组件标记!令人沮丧github.com/dotnet/aspnetcore/issues/23603
      • 我也可以只传回一个具有 3 个属性的自定义单个对象......但是违背了多参数能力的目的
      猜你喜欢
      • 2021-02-02
      • 2021-11-04
      • 2021-08-25
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      相关资源
      最近更新 更多