我想在同一窗口选项卡中显示不同的页面。我使用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的类(视图):
@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()
}
}
当我打开新窗口时,我看到句子“这是默认视图”,这没关系。但是,当我看着tracksace时,我发现句子“ 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”被调用了两次。我如何修改代码以使视图仅被调用一次?
最佳答案
发生这种情况的原因是因为您在Navigator.navigateTo()
方法中调用了Empty.init()
。每个导航操作都会创建一个新的View Bean实例(视图不是单例)。调用Navigator.navigateTo()
之后,稍后将在UI.doInit()
方法中再次调用它,这将导致第二个bean创建。
如果要将“ empty1”视图设为默认视图(如果未在url中指定其他视图,则显示默认视图),则应执行以下操作:
if ("".equals(navigator.getState())) {
getPage().setUriFragment("!" + Empty1.VIEW_NAME, false);
}
当然,您也可以将视图命名为
""
以使其默认。