【问题标题】:Passing values between classes in Vaadin在 Vaadin 中的类之间传递值
【发布时间】:2021-07-21 23:07:37
【问题描述】:

这可能更像是一个 Java 问题,但是如何从不同的类访问给定视图/类的值(比如从文本字段中)?例如,如果 MainView 中有一个 TextField t1,我想获取它的当前值以用于不同类中的计算。这里有更具体的 Vaadin 方法吗?

【问题讨论】:

  • 在您的示例中,是什么触发了计算执行?
  • @BasilBourque 复选框值更改侦听器。我尝试实现的下一步是然后获取文本字段值,进行计算,并在主视图中可视化它
  • 我为每个视图使用 POJO,并在该视图的整个流程中传递这个 POJO。

标签: vaadin vaadin-flow vaadin14


【解决方案1】:

这可能取决于具体的用例。由于您提到了 TextField 值,我假设该值存储在数据库中,它只是在 UI 上 -> 我排除了单例 spring 服务。

一些想法:

  1. 如果 MainView 和不同的类是嵌套组件并且它是可行的并且在很多类中并不复杂......那么可能在创建子组件时将其传递下去。 这是一个幼稚的解决方案 - 它可能会变得非常混乱。

    MainView() {
        var t1 = new TextField();
        var d = new Different(t1);
    }
    
  2. 触发并监听 Vaadin 组件事件。如果你想要真正的松耦合,最通用的方法是使用 UI 实例作为事件总线。

    // listen in different class
    ComponentUtil.addListener(attachEvent.getUI(), CloseMenuEvent.class, e -> closeMenu());
    // fire change in MainView
    ComponentUtil.fireEvent(ui, new CloseMenuEvent(ui))
    
  3. 数字 2 的更具体版本是将 MainView 的 t1ValueChangeListener 传递给不同的类。

    MainView() {
        var t1 = new TextField();
        var d = new DifferentClass();
        t1.addValueChangeListener(d::t1Changed)
        add(t1, d);
    }
    
  4. 将公共字段提取到第三方,到第三类。使用 @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 种方法。

【讨论】:

  • 感谢这份详尽的清单!我会先尝试#3,然后跟进
猜你喜欢
  • 2014-01-15
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
相关资源
最近更新 更多