我想在同一个窗口标签中显示不同的页面。我使用类Empty和Empty1。 Empty类是一个主页面,视图Empty1被加载到Empty。
名为Empty的类:
@Theme("valo")
@SpringUI(path = "empty")
public class Empty extends UI {
@Autowired
private SpringViewProvider viewProvider;
@Override
protected void init(VaadinRequest request) {
System.out.println("init Empty");
final VerticalLayout root = new VerticalLayout();
root.setSizeFull();
setContent(root);
Navigator navigator = new Navigator(this, this);
navigator.addProvider(viewProvider);
navigator.navigateTo(Empty1.VIEW_NAME);
}
}
和类名为Empty1(view):
@SpringView(name = Empty1.VIEW_NAME)
public class Empty1 extends VerticalLayout implements View {
public static final String VIEW_NAME = "empty1";
@PostConstruct
void init() {
addComponent(new Label("This is the default view"));
System.out.println("init Empty1");
}
@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
// the view is constructed in the init() method()
}
}
当我打开新窗口时,我看到句子"这是默认视图"没关系。 但是当我在轨道上看时,我注意到了句子" init Empty1"这显示了两次,为什么?
这意味着视图Empty1的内容被加载两次。 我希望视图只加载一次。
最终的效果应该在“空白”中看起来像这样。类:
@Theme("valo")
@SpringUI(path = "empty")
public class Empty extends UI {
@Autowired
private SpringViewProvider viewProvider;
@Override
protected void init(VaadinRequest request) {
System.out.println("init Empty");
final VerticalLayout root = new VerticalLayout();
root.setSizeFull();
setContent(root);
Navigator navigator = new Navigator(this, this);
navigator.addProvider(viewProvider);
int optionAuto = 2;
switch (optionAuto) {
case 1:
getUI().getNavigator().navigateTo(Empty1.VIEW_NAME);
break;
case 2:
getUI().getNavigator().navigateTo(Empty2.VIEW_NAME);
break;
}
}
}
它有效,但查看' Empty1'或者' Empty2'被称为两次。如何才能修改代码以便只调用一次视图?
答案 0 :(得分:2)
之所以发生这种情况,是因为您在Navigator.navigateTo()
方法中调用了Empty.init()
。每个导航操作都会创建新的视图bean实例(视图不是单例)。在您致电Navigator.navigateTo()
之后,它会在UI.doInit()
方法中再次调用,从而导致第二次创建bean。
如果你想让你的"空1"查看默认视图(如果在url中未指定其他视图,则显示该视图),那么这样的事情应该有效:
if ("".equals(navigator.getState())) {
getPage().setUriFragment("!" + Empty1.VIEW_NAME, false);
}
当然,您也可以将视图命名为""
,以使其成为默认视图。
答案 1 :(得分:0)
如果在类Empty1的上方添加@UIScope,则可以使用getNavigator().navigateTo()
,而无需每次都创建视图Bean的新实例。