我想使用 Vaadin 在我的 Web 应用程序中实现 MVP 模式。我正在使用 Vaadin Navigator 和 CDIViewProvider,如下所示:
//MyUI.java
public class MyUI extends UI {
@Inject
CDIViewProvider viewProvider;
Navigator navigator;
@Override
protected void init(VaadinRequest vaadinRequest) {
//UI setup
navigator = new Navigator(this, someContainer);
navigator.addProvider(viewProvider);
getNavigator().navigateTo("myView");
}
}
//MyViewImpl.java
@CDIView("myView")
public class MyViewImpl extends VerticalLayout implements com.vaadin.navigator.View, MyView {
// ...
据我了解,视图提供程序实例化了 MyViewImpl 的一个对象,该对象是 ViewScoped,即当用户导航到/离开该视图时它会被创建/销毁。接下来我需要考虑在哪里实例化这个视图的presenter。我考虑过将其设为 SessionScoped 并将其注入到视图中:
// ... continue MyViewImpl.java
@Inject
private MyViewListener presenter;
// in some of the MyViewImpl methods we can do stuff like presenter.buttonClicked();
}
//MyViewPresenter.java
@SessionScoped
public class MyViewPresenter implements MyView.MyViewListener {
MyView view; //how can the presenter obtain the view here ?
@PostConstruct
public void init()
@Override
public void buttonClicked() {
view.displaySomething();
}
}
//MyView.java
public interface MyView {
public interface MyViewListener {
public void buttonClicked();
}
public void displaySomething();
}
正如我已经在演示者引用视图后面的评论中指出的那样,我不知道演示者如何获取视图实例(由视图提供者创建)。让演示者处于 SessionScoped 范围内,而每当视图更改时视图就会被创建/销毁,这是否有意义?另一种方法是视图没有对演示者的引用,但演示者将自身添加为视图的侦听器。然而,在这种情况下,我再次不知道在哪里实例化演示者以及如何获取对当前视图的引用。
不要尝试注入视图,而是在演示者中使用视图设置器并从视图中调用它@PostConstruct
:
@Dependent
class MyPresenter {
private MyView view;
public void setView(MyView view) {
this.view = view;
}
}
public interface MyView {
}
@CDIView("my-view")
public class MyViewImpl extends VerticalLayout implements View, MyView {
@Inject
private MyPresenter presenter;
@PostConstruct
private void init() {
presenter.setView(this);
}
}
我认为创建顺序是这里令人困惑的问题。在某种程度上,视图具有更高的优先级,因为它们是在您调用时由 Vaadin 创建的getNavigator().navigateTo("my-view")
。 Presenter 由 CDI 的视图实例化(即使它监督视图)并且应该具有@Dependent
scope.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)