如何解决Vaadin 从 RouterLayout 中引用 mainLayout
我需要在应用程序屏幕之间创建一个缓冲区。 我想在 mainLayout 中创建一个缓冲区,但我无法从子层访问它
我试图通过'static'来做到这一点,然后缓冲区对所有用户都是通用的,这是不正确的
Cookies也不适合,因为数据结构复杂
带有静态缓冲区的代码:
示例中创建了一个表,当你选择表中的元素时,将它们写入缓冲区,如果缓冲区中有元素,则在表中进行标记
MainLayout.java
public class MainLayout extends AppLayout implements RouterLayout {
public static Set<Test> buffer;
public MainLayout() {
buffer = new HashSet<Test>();
/*...*/
}
}
基本视图.java
@Route(value = "BasicView",layout = MainLayout.class)
@RouteAlias(value = "/BasicView",layout = MainLayout.class)
public class BasicView extends VerticalLayout {
private final Grid<Test> tests;
public BasicView(@Autowired TestService){
/*...*/
tests = new Grid<>(Test.class,false);
tests.addSelectionListener(event -> {
MainLayout.buffer = event.getAllSelectedItems();});
/*...*/
for(Test el : MainLayout.buffer)
{
tests.select(el);
}
/*...*/
}
}
解决方法
您实际上可以遍历布局的父级直至主布局。例如。你可以在下面做一些事情
Optional<Component> parent = this.getParent();
Buffer buffer = null;
while (parent.isPresent()) {
Component p = parent.get();
if (p instanceof MainLayout) {
MainLayout main = (MainLayout) p;
buffer = main.getBuffer();
}
parent = p.getParent();
}
但是我不确定这是否是最好的方法。如果你碰巧使用例如Spring Boot,将此缓冲区作为 VaadinSessionScoped bean 并在需要时自动装配它会更自然。 Vaadin 的下一个版本还将添加特定的 RouteScope,以便在需要时进行更多的精确范围界定。
另见有关此问题的旧 Vaadin 论坛讨论:https://vaadin.com/forum/thread/17917385/vaadin-14-accessing-components-of-mainview
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。