我在我的MainLayout.razor
组件中有一个侧面抽屉,用于设置/更改特定的值,然后在整个应用程序中使用这些值。
<CascadingValue Value="@appValues" Name="AppValue">
<SideDrawer OnUpdate="@RefreshPage"></SideDrawer>
<div class="content px-4">
@Body
</div>
</CascadingValue>
当我更新SideDrawer中的值时,我执行一个EventCallback
,通过它我可以更新变量,然后这些变量可以用作整个页面组件中的级联值。
@code{
public AppValues appValues = new AppValues();
protected void RefreshPage()
{
appValues.value1 = somevaluefromsidedrawer;
appValues.value2 = someothervaluefromsidedrawer;
StateHasChanged();
}
}
并且这些级联值在页面组件中可以很好地更新。但问题是,在页面组件中,有一种方法(比方说LoadData()
),其中某些数据集应该根据这些级联值进行更新。
@code{
[CascadingParameter(Name = "AppValue")]
protected AppValues appValues { get; set; }
protected void RefreshCurrentPage()
{
LoadData(appValues.value1);
}
}
理想情况下,我希望能够从MainLayout.razor
组件中的RefreshPage()
方法调用页面组件中的RefreshCurrentPage()
方法,以便根据更新后的值刷新页面组件中的所有datasets。
有可能做这样的事情吗?
发布于 2020-07-17 17:50:40
您可以通过多种方式完成此操作:
您可以将对MainLayout组件的引用以CascadingValue虚拟组件的形式传递给感兴趣的子组件,如下所示:
<CascadingValue Value="this" Name="TheMainLayout">
</CascadingValue>
子组件应该像这样获取引用:
@code{
[CascadingParameter(Name = "TheMainLayout")]
public MainLayout MainLayout { get; set; }
}
并将其自身添加到MainLayout组件中定义的组件列表中:
// Child component adds itself to the MainLayout component
protected override void OnInitialized()
{
MainLayout.AddPage(this);
}
在MainLayout组件中,您将定义一个ComponentBase对象列表和AddPage方法,如下所示:
public void AddPage(ComponentBase page)
{
// Code to add the page component to the list
}
既然MainLayout包含对组件的引用,它就可以直接调用在每个添加的页面组件中定义的RefreshCurrentPage (我猜它只能是一个,因为我们正在讨论可路由组件,对吧)。
注意:以上只是一个解决方案的概要。您可以对其进行扩展,以提供在每次需要刷新数据时都会引发的事件,并且每个页面组件都应该订阅该事件,当该事件引发时,将调用RefreshCurrentPage方法。与直接从MainLayout调用RefreshCurrentPage相比,这是一种更好、更复杂的方法。
您应该提供代码来从组件列表中删除添加的组件引用,当这些组件被终止时,等等。
请注意,不再需要appValues的CascadingValue,因为子组件持有对MainLayout的引用,并且可以直接访问这些值。
注意:上述所有过程都可以通过注入到MainLayout组件及其子组件中的服务类来实现。
再见了,伙计。
https://stackoverflow.com/questions/62957401
复制相似问题