在 Vaadin 中从另一个 UI 刷新网格
Refresh grid from another UI in Vaadin
我有一个主布局,其中包含另一个带有网格和按钮的 UI。此网格显示我的数据库的 table 的数据。使用按钮打开一个向导,我可以在其中为该数据库创建一个新条目。当我单击按钮关闭向导时,我希望网格刷新以显示新添加的条目。一切正常,包括存储到我的数据库,除了我的网格刷新。
所以我有 UI
public class MainLayout{
...
public void refreshGrid()
{
this.grid.getDataProvider().refreshAll();
}
}
定义网格的位置。我已经实现了刷新 method.In 还有创建新条目的按钮。当我单击此按钮时,将调用下一个 UI。
UI 包含向导的总体布局,带有标签栏。
public class WizardLayout{
}
在这些选项卡之一中,最后有 UI 和用于创建条目的输入字段。还有保存到数据库的按钮。
public class CreateEntry{
...
private void button_onClick(ClickEvent<Button> event)
{
...
}
}
在此按钮单击方法中,实现了保存它的逻辑。之后我想从第一个 UI 调用刷新方法来刷新它。我该怎么做才能让它起作用?
请记住,其他一切正常。所以我唯一的问题是刷新网格,因为它不会自动刷新。我必须单击浏览器中的刷新按钮才能使其正常工作。
首先请注意,虽然没有错,但您对 UI 一词的使用在 Vaadin 上下文中可能会造成混淆,因为它通常用于指代 Vaadin UI
对象,其中通常有每个选项卡一个。 Vaadin UI 之间的通信比您的用例更复杂。
对此有很多解决方案,最简单的可能是将 MainLayout
的实例传递给向导。
在这种情况下,类 将紧密耦合,即两者相互依赖。
更好的方法是使用某种侦听器或回调。这可以变得非常复杂,但在最简单的情况下,您只需传递一个回调,该回调将在保存时 运行。
WizardLayout.java
private final Runnable saveCallback;
public WizardLayout(Runnable saveCallback) {
this.saveCallback = saveCallback;
}
private void button_onClick(ClickEvent<Button> event) {
...
saveCallback.run();
}
MainLayout.java
new WizardLayout(this::refreshGrid);
您的数据提供者是否使用 in-memory items, or do you use a callback dataprovider with lazy loading?
您可能正在使用内存数据提供程序。就是这种情况,当您从数据库加载项目并将它们放入
的网格中时
grid.setItems(fooService.findAll());
调用grid.getDataProvider().refresh()
只会刷新已经设置的项目。由于您有一个新项目要显示,您必须使用您的服务从数据库中再次 获取所有项目。
grid.setItems(fooService.findAll());
grid.getDataProvider().refreshAll();
如果您使用延迟加载的回调数据提供程序,那么我认为只需刷新数据提供程序就足够了。我对延迟加载的数据提供者知之甚少,无法为这个问题提供解决方案,但我相信如果使用回调数据提供者,这个问题不应该首先出现
我有一个主布局,其中包含另一个带有网格和按钮的 UI。此网格显示我的数据库的 table 的数据。使用按钮打开一个向导,我可以在其中为该数据库创建一个新条目。当我单击按钮关闭向导时,我希望网格刷新以显示新添加的条目。一切正常,包括存储到我的数据库,除了我的网格刷新。
所以我有 UI
public class MainLayout{
...
public void refreshGrid()
{
this.grid.getDataProvider().refreshAll();
}
}
定义网格的位置。我已经实现了刷新 method.In 还有创建新条目的按钮。当我单击此按钮时,将调用下一个 UI。 UI 包含向导的总体布局,带有标签栏。
public class WizardLayout{
}
在这些选项卡之一中,最后有 UI 和用于创建条目的输入字段。还有保存到数据库的按钮。
public class CreateEntry{
...
private void button_onClick(ClickEvent<Button> event)
{
...
}
}
在此按钮单击方法中,实现了保存它的逻辑。之后我想从第一个 UI 调用刷新方法来刷新它。我该怎么做才能让它起作用?
请记住,其他一切正常。所以我唯一的问题是刷新网格,因为它不会自动刷新。我必须单击浏览器中的刷新按钮才能使其正常工作。
首先请注意,虽然没有错,但您对 UI 一词的使用在 Vaadin 上下文中可能会造成混淆,因为它通常用于指代 Vaadin UI
对象,其中通常有每个选项卡一个。 Vaadin UI 之间的通信比您的用例更复杂。
对此有很多解决方案,最简单的可能是将 MainLayout
的实例传递给向导。
在这种情况下,类 将紧密耦合,即两者相互依赖。
更好的方法是使用某种侦听器或回调。这可以变得非常复杂,但在最简单的情况下,您只需传递一个回调,该回调将在保存时 运行。
WizardLayout.java
private final Runnable saveCallback;
public WizardLayout(Runnable saveCallback) {
this.saveCallback = saveCallback;
}
private void button_onClick(ClickEvent<Button> event) {
...
saveCallback.run();
}
MainLayout.java
new WizardLayout(this::refreshGrid);
您的数据提供者是否使用 in-memory items, or do you use a callback dataprovider with lazy loading?
您可能正在使用内存数据提供程序。就是这种情况,当您从数据库加载项目并将它们放入
的网格中时grid.setItems(fooService.findAll());
调用grid.getDataProvider().refresh()
只会刷新已经设置的项目。由于您有一个新项目要显示,您必须使用您的服务从数据库中再次 获取所有项目。
grid.setItems(fooService.findAll());
grid.getDataProvider().refreshAll();
如果您使用延迟加载的回调数据提供程序,那么我认为只需刷新数据提供程序就足够了。我对延迟加载的数据提供者知之甚少,无法为这个问题提供解决方案,但我相信如果使用回调数据提供者,这个问题不应该首先出现