在 Vaadin 中 类 之间传递值

Passing values between classes in Vaadin

这可能更像是一个 Java 问题,但是您如何从不同的 class 访问给定 view/class 的值(比如从文本字段)?例如,如果 MainView 中有一个 TextField t1,我想在不同的 class 中获取其当前值以进行计算。这里是否有更特定于 Vaadin 的方法?

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

一些想法:

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

    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传递给不同的class.

    MainView() {
        var t1 = new TextField();
        var d = new DifferentClass();
        t1.addValueChangeListener(d::t1Changed)
        add(t1, d);
    }
    
  4. 提取公用字段给第三方,给第三方class。使用 @UIScoped spring bean (@SpringComponent, @Service, ...) 将保存该字段,并将其注入 MainView 和不同的 class .

    @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
    }
    

    您可以更改第 4 种方法,方法是将 String 保留在模型中并使用值更改侦听器对其进行更新。