Data binding Blazor嵌套子对象更新子对象,但父对象不更新';t立即更新
家长:Data binding Blazor嵌套子对象更新子对象,但父对象不更新';t立即更新,data-binding,parameters,callback,nested,blazor,Data Binding,Parameters,Callback,Nested,Blazor,家长: 设置 @代码{ 公共列表信息{get;set;} 私有TourOfficeSettings设置模板{get;set;} 受保护的重写异步任务OnInitializedAsync() { 尝试 { var result=await Http.GetFromJsonAsync(“api/TourOffice”); informations=result.ToList(); filteredTouOffDatas=touOffDatas; } 捕获(AccessTokenNotAvailab
设置
@代码{
公共列表信息{get;set;}
私有TourOfficeSettings设置模板{get;set;}
受保护的重写异步任务OnInitializedAsync()
{
尝试
{
var result=await Http.GetFromJsonAsync(“api/TourOffice”);
informations=result.ToList();
filteredTouOffDatas=touOffDatas;
}
捕获(AccessTokenNotAvailableException异常)
{
异常。重定向();
}
}
}
儿童:
<TourOfficesSettings @ref="SettingsModal" @bind-Informations="informations"></TourOfficesSettings>
<button class="btn btn-outline-primary" type="button" @onclick="() => SettingsModal.Modal.Open()"><span>Settings</span></button>
@code {
public List<TouOffInformationModel> informations { get; set; }
private TourOfficesSettings SettingsModal { get; set; }
protected override async Task OnInitializedAsync()
{
try
{
var result = await Http.GetFromJsonAsync<List<TouOffInformationModel>>("api/TourOffices");
informations = result.ToList();
filteredTouOffDatas = touOffDatas;
}
catch (AccessTokenNotAvailableException exception)
{
exception.Redirect();
}
}
}
@代码{
[参数]
公共列表信息{get;set;}
[参数]
公共事件回调信息更改{get;set;}
公共模态{get;set;}
私有TouOffform信息模式{get;set;}
}
嵌套子项:
<Modal @ref="Modal" ModalSize="xl" ModalId="settings">
<TouOffInfoForm @ref="informationModal" @bind-Informations="Informations"></TouOffInfoForm>
</Modal>
@code {
[Parameter]
public List<TouOffInformationModel> Informations { get; set; }
[Parameter]
public EventCallback<List<TouOffInformationModel>> InformationsChanged { get; set; }
public Modal Modal { get; set; }
private TouOffInfoForm informationModal { get; set; }
}
创建
@代码{
[参数]
公共列表信息{get;set;}
[参数]
公共事件回调信息更改{get;set;}
公共异步任务创建(){
var模型=新的ToOfInformationModel(..);
信息。添加(模型);
等待信息更改。调用同步(信息);
}
}
我的问题是:只有“嵌套子项”更改“信息”,更改后,我在“子项”中看到更改,但在“父项”中,只有再次打开并关闭“子项”时才会发生更改
你们能帮我设置“Child”吗?这样一旦信息被更改,我就可以在那里执行“InformationsChanged.InvokeAsync()”?这似乎是一个“值与引用”的问题。您正在更改列表项本身中的基础数据,但请记住,列表是内存中的引用项,您必须将其视为引用项StateHasChanged
具有调用它的组件和任何子组件的上下文,这意味着Blazor将在一个组件的范围内按预期运行,但您也必须将更改通知更高级别的组件
从我的角度来看,简单的修复方法(也是一种稍微清理代码的方法)是将列表及其所有状态管理逻辑保持在同一个组件中。这意味着您的顶级“父级”组件应该具有Create(ToOfInformationModel)
方法(注意方法签名!),因为这是定义列表信息的地方。然后,您可以将Create(toufformationmodel)
方法作为事件回调传递到组件树下,当子组件调用它时,它实际上发生在树的顶部。如果仍然存在数据显示问题,您可以在新的Create方法中包括statehaschange()
,它应该都能正常工作。这将使“父”组件代码块看起来像这样:
@code{
公共列表信息{get;set;}
私有TourOfficeSettings设置模板{get;set;}
公共任务创建(ToOffInformation模型){
信息。添加(模型);
//这可能不是必需的,但请尝试两种方法
StateHasChanged();
}
受保护的重写异步任务OnInitializedAsync()
{
尝试
{
var result=await Http.GetFromJsonAsync(“api/TourOffice”);
informations=result.ToList();
filteredTouOffDatas=touOffDatas;
}
捕获(AccessTokenNotAvailableException异常)
{
异常。重定向();
}
}
}
然后将Create
方法传递到任何需要的地方
第二个更健壮的选择是实现注入服务和/或构建一个数据模型,该模型将处理其自身的状态管理并根据需要进行通知,但这是一个更大、更复杂的范围。尽管如此,通过这样做,您将获得大量的解耦,如果您感兴趣,我建议您研究Blazor的状态管理选项
<button class="btn btn-outline-danger" @onclick="Create()">Create</button>
@code {
[Parameter]
public List<TouOffInformationModel> Informations { get; set; }
[Parameter]
public EventCallback<List<TouOffInformationModel>> InformationsChanged { get; set; }
public async Task Create() {
var model = new TouOffInformationModel(....);
Informations.Add(model);
await InformationsChanged.InvokeAsync(Informations);
}
}