如何从 blazor 中的 EventCallback 获取返回值?

Ven*_*sky 4 c# blazor blazor-server-side blazor-client-side

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

自动完成将有一个Parameter将接收 astring并返回 a IEnumerable<TValue>

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

自动完成.razor

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

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

父组件.razor

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

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

问题是我不知道该放什么SOME_TYPE。我应该使用EventCallback吗?Action? 我应该使用什么?

我尝试使用EventCallback但看起来我无法从EventCallback? 我不知道。

knr*_*knr 10

您还可以使用 of 参数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;
}
Run Code Online (Sandbox Code Playgroud)


小智 6

在子组件中:

<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()));
    }
    }

Run Code Online (Sandbox Code Playgroud)

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

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

在标记区域:


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

Run Code Online (Sandbox Code Playgroud)

在代码区域:


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

Run Code Online (Sandbox Code Playgroud)


Ven*_*sky 5

我只是想知道怎么做,我应该使用Func<string, Task<IEnumerable<TValue>>>.

[Parameter]
public Func<string, Task<IEnumerable<TValue>>> GetItems { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

  • 但这样做会在每次事件处理程序调用后失去自动组件刷新。你必须自己调用 StateHasChanged (4认同)