【问题标题】:How to get return value from EventCallback in blazor?如何从 blazor 中的 EventCallback 获取返回值?
【发布时间】:2020-08-04 07:46:53
【问题描述】:

我的情况是这样的:我正在尝试实现和自动完成。

自动完成将有一个Parameter,它将接收一个string并返回一个IEnumerable<TValue>。

这是我正在尝试做的一个示例

Autocomplete.razor

@code {
    [Parameter]
    public SOME_TYPE GetItems { get; set; }

    async void Foo(){
        IEnumerable<TValue> items = await GetItems(SomeString);
        // do something with items
    } 
}

ParentComponent.razor

<Autocomplete TValue="SomeEntity"
              GetItems="@GetItems" />

@code {        
    SOME_TYPE GetItems(string name) {
        IEnumerable<SomeEntity> entity = await GetEntitys(name);
        return entity;
    } 
}

问题是我不知道在SOME_TYPE 中输入什么。我应该使用EventCallback 吗? Action?我应该使用什么?

我尝试使用EventCallback,但似乎无法从EventCallback 获得返回值?我不知道。

【问题讨论】:

    标签: c# blazor blazor-server-side blazor-client-side


    【解决方案1】:

    我刚刚知道怎么做,我应该使用Func&lt;string, Task&lt;IEnumerable&lt;TValue&gt;&gt;&gt;。

    [Parameter]
    public Func<string, Task<IEnumerable<TValue>>> GetItems { get; set; }
    

    还有

    public async Task<IEnumerable<Employee>> GetItems(string name) {
        IEnumerable<SomeEntity> entity = await GetEntitys(name);
        return entity;
    } 
    

    【讨论】:

      【解决方案2】:

      您也可以为此使用EventCallback 的参数:

      public class CancelArg
      {
          public bool Value { get; set; }
      }
      
      [Parameter]
      public EventCallback<CancelArg> OnFoo { get; set; }
      
      async Task CallerInChild()
      {
          var cancel = new CancelArg();
          await OnFoo.InvokeAsync(cancel);
          if (cancel.Value)
          {
              // cancelled ...
          }
      }
      
      void HandlerInParent(CancelArg cancel)
      {
          cancel.Value = true;
      }
      

      【讨论】:

        【解决方案3】:

        在子组件中:

        <div class="form-group">
            <label for="ddSetStatus">Status</label>
            <InputSelect class="form-control" id="ddSetStatus" @bind-Value="@Status" @oninput="@((e) => ChangedSelection(e))">
                <option value="1">Draft </option>
                <option value="2">Published </option>
                <option value="3">Archived </option>
           </InputSelect>
        </div>
        
            @code
            {
            [Parameter] public EventCallback<int> OnStatusSelected { get; set; }
        
            [Parameter] public int Status { get; set; }
        
            private async Task ChangedSelection(ChangeEventArgs args)
            {
                await OnStatusSelected.InvokeAsync(int.Parse(args.Value.ToString()));
            }
            }
        
        

        然后在父页面或组件中使用选定的值:

        创建一个组件(在本例中称为 DocStatus)并定义事件处理方法

        在标记区域:

        
         <DocStatus Status="@Status" OnStatusSelected="StatusSelectionHandler"/>
        
        

        在代码区:

        
         private void StatusSelectionHandler(int newValue)
         {
             Status = newValue;   
         }
        
        

        【讨论】:

          猜你喜欢
          • 2021-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-13
          相关资源
          最近更新 更多