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