在 Vaadin 中 类 之间传递值
Passing values between classes in Vaadin
这可能更像是一个 Java 问题,但是您如何从不同的 class 访问给定 view/class 的值(比如从文本字段)?例如,如果 MainView 中有一个 TextField t1,我想在不同的 class 中获取其当前值以进行计算。这里是否有更特定于 Vaadin 的方法?
具体取决于用例。由于您提到了一个 TextField 值,我假设该值是 not 尚未存储在数据库中,它只是在 UI 上 -> 我排除了单例 spring 服务.
一些想法:
如果 MainView 和不同的 class 是嵌套组件并且它是可行的并且在很多 classes 中并不复杂......那么可能将它传递给创建子组件时的方式。 这是一个天真的解决方案 - 它可能会变得非常混乱。
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的t1
的ValueChangeListener
传递给不同的class.
MainView() {
var t1 = new TextField();
var d = new DifferentClass();
t1.addValueChangeListener(d::t1Changed)
add(t1, d);
}
提取公用字段给第三方,给第三方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 保留在模型中并使用值更改侦听器对其进行更新。
这可能更像是一个 Java 问题,但是您如何从不同的 class 访问给定 view/class 的值(比如从文本字段)?例如,如果 MainView 中有一个 TextField t1,我想在不同的 class 中获取其当前值以进行计算。这里是否有更特定于 Vaadin 的方法?
具体取决于用例。由于您提到了一个 TextField 值,我假设该值是 not 尚未存储在数据库中,它只是在 UI 上 -> 我排除了单例 spring 服务.
一些想法:
如果 MainView 和不同的 class 是嵌套组件并且它是可行的并且在很多 classes 中并不复杂......那么可能将它传递给创建子组件时的方式。 这是一个天真的解决方案 - 它可能会变得非常混乱。
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的
t1
的ValueChangeListener
传递给不同的class.MainView() { var t1 = new TextField(); var d = new DifferentClass(); t1.addValueChangeListener(d::t1Changed) add(t1, d); }
提取公用字段给第三方,给第三方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 保留在模型中并使用值更改侦听器对其进行更新。