【发布时间】:2020-07-28 11:26:22
【问题描述】:
我想通过EventCallback 更新子组件TodoComponent 中的TodoItem。
在我的TodoPage.razor.cs 中,我实现了一个更新方法:
public async void UpdateTodo(TodoItem todoItem)
{
await Http.PutAsJsonAsync("todo", todoItem);
await RefreshTodos();
}
然后我试图传递给负责渲染对象的TodoComponent
@foreach (var item in @TodoItems)
{
<div class="row">
<CascadingValue Value=@item Name="TodoItem">
<TodoComponent UpdateCallback="@(async () => UpdateTodo(item))">
</TodoComponent>
</CascadingValue>
</div>
}
TodoComponent.razor
@inherits ListOfTodos.Client.Components.TodoComponentBase
<div class="input-group col-12">
<div class="input-group-prepend">
<div class="input-group-text">
<input type="checkbox" @bind="@TodoItem.IsDone" onclick="@UpdateCallback">
</div>
</div>
<div class="col-8">
<input type="text" class="form-control" @bind="@TodoItem.TaskName" oninput="@UpdateCallback" />
</div>
<div class="input-group-append">
<input type="date" @bind="@TodoItem.DueDate" />
</div>
</div>
附加信息:
public async Task RefreshTodos()
{
TodoItems = await Http.GetFromJsonAsync<List<TodoItem>>("todo");
StateHasChanged();
}
public class TodoComponentBase : ComponentBase
{
[CascadingParameter(Name = "TodoItem")]
public TodoItem TodoItem { get; set; }
[Parameter]
public EventCallback<TodoItem> UpdateCallback { get; set; }
protected override Task OnInitializedAsync()
{
return base.OnInitializedAsync();
}
}
当我调用UpdateCallback 虽然onchange 或oninput 时TodoItem 就像它根本没有更新一样,我不知道绑定是否按我的预期工作去做。
如何正确地将对象传递给子组件并使其正确更新?
这是 github 仓库:https://github.com/DgoNeves/Blazor.ListOfTodos 它在内存中工作,因此您不需要任何数据库来运行它。
【问题讨论】:
-
致电
StateHasChanged() -
我添加了一些附加信息以表明我已经在调用 stateHasChanged,尽管它与 UI 无关,因为当我在 UI 中进行更改时,问题是对象没有更新,因此在调用 API 时它被“更新”到相同的状态
-
只是,为什么在这种情况下使用级联参数而不是经典参数?
-
我都试过了,都没有像我预期的那样工作
-
可能是因为更新不起作用?