如何解决在 Vaadin 中的类之间传递值
这可能更像是一个 Java 问题,但是您将如何访问来自不同类的给定视图/类的值(比如来自文本字段)?例如,如果 MainView 中有一个 TextField t1,我想获取它的当前值以用于不同类中的计算。这里是否有更针对 Vaadin 的方法?
解决方法
这具体取决于用例。由于您提到了一个 TextField 值,我假设该值未尚未存储在数据库中,它只是在 UI 上 -> 我排除了单例 Spring 服务。
一些想法:
-
如果 MainView 和不同的类是嵌套组件,并且它在很多类中都是可行的并且并不复杂......那么可能在创建子组件时将其传递下去。 这是一个天真的解决方案 - 它可能会变得非常混乱。
MainView() { var t1 = new TextField(); var d = new Different(t1); }
-
触发并监听 Vaadin 组件事件。如果你想要真正的松耦合,最通用的方法是使用 UI 实例作为事件总线。
// listen in different class ComponentUtil.addListener(attachEvent.getUI(),CloseMenuEvent.class,e -> closeMenu()); // fire change in MainView ComponentUtil.fireEvent(ui,new CloseMenuEvent(ui))
-
数字 2 的更具体版本是将 MainView 的
ValueChangeListener
的t1
传递给不同的类。MainView() { var t1 = new TextField(); var d = new DifferentClass(); t1.addValueChangeListener(d::t1Changed) add(t1,d); }
-
将公共字段提取给第三方,给第三方。使用将保存该字段的
@UIScoped
spring bean (@SpringComponent
,@Service
,...),并将其注入 MainView 和不同的类。@Route public class MainView extends VerticalLayout { public MainView(Model m,Different d) { add(m.t1,d); } } @Scope(SCOPE_PROTOTYPE) public class Different extends Component { public Different(Model m) { // something with m.t1 } } @UIScoped public class Model { public final TextField t1 = new TextField(); // TODO use getter }
您可以通过将 String 保留在 Model 中并拥有一个更新它的值更改侦听器来更改第 4 种方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。