如何从 blazor 中的 EventCallback 获取 return 值?
How to get return value from EventCallback in blazor?
我的情况是这样的:我正在尝试实现和自动完成。
自动完成将有一个 Parameter
,它将收到一个 string
和 return 一个 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
获得 return 值?我不知道。
我刚知道怎么做,我应该用Func<string, Task<IEnumerable<TValue>>>
。
[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;
}
你也可以使用 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;
}
在子组件中:
<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;
}
我的情况是这样的:我正在尝试实现和自动完成。
自动完成将有一个 Parameter
,它将收到一个 string
和 return 一个 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
获得 return 值?我不知道。
我刚知道怎么做,我应该用Func<string, Task<IEnumerable<TValue>>>
。
[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;
}
你也可以使用 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;
}
在子组件中:
<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;
}