在同级页面上呼叫StateHasChanged

时间:2020-08-13 17:43:38

标签: blazor

我有一个页面,其中的Order对象声明为CascadingValue。该父页面有2个子页面,一个带有订单信息,另一个带有订单上的订单项列表。这些兄弟页面中的每一个都通过CascadingValue使用Order信息。

订单信息页面上有一个按钮,应清除订单上的所有订单项。该按钮起作用,并且通过调用Order CascadingValue上的ClearLineItems方法清除所有订单项。

不过,包含订单项列表的页面并未刷新。它仍然显示现在已删除的订单项。一页如何告诉其兄弟页面其StateHasChanged?

要绘制订单项,我有一个名为LineItemDetail的控件,我将其绘制为这样。 (每行上都有一个按钮,允许用户仅删除该行,这是DeleteLine参数。逐行删除功能正常)

@foreach (var row in CurrentOrder.LineItems)
{
    <LineItemDetail CurrentLine=@row DeleteLine=@DelLine></UpchargeInfo>
}

这真的是更大的问题,如何将消息从一个Blazor页面发送到另一页面。就像消息总线一样,但在Blazor内部。

这说明了问题。从子窗体添加订单项不会更新父窗体,也不会更新其他同级。一个人必须积极地刷新父级,然后级联下来更新子级。 https://github.com/bradirby/BlazorChildFormUpdates

1 个答案:

答案 0 :(得分:0)

我的原始答案似乎已经过时;除了使用EventCallbacks可以解决问题之外。

这是我的新答案:

添加对组件的引用。像这样:

<Component1 @ref="comp1" SiblingComponent="@comp2" />
<Component2 @ref="comp2" SiblingComponent="@comp1" />

@code {
    public ElementReference comp1 { get; set; }
    public ElementReference comp2 { get; set; }
}

然后在Component1和Component2内部调用SiblingComponent.UpdateState()

然后SiblingComponent填充

private void UpdateState() {
    StateHasChanged();
}

明显不满意的答案:

最可能的问题不是不是未调用StateChanged,而是实际上该同级页面的状态没有更改。 您不能在子组件中更改级联值。仅针对该子组件中的副本更改它,而不更改父组件中的副本。 您有一些选择。但最合适的方法可能是回调方法。您对子组件的操作会触发父组件中的方法,该方法会更改父级别的值,从而更新子组件中的值。