当我使用Navigator和SpringViewProvider时,为什么页面被加载了两次?

时间:2017-08-27 08:31:10

标签: java spring navigation vaadin

我想在同一个窗口标签中显示不同的页面。我使用类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'被称为两次。如何才能修改代码以便只调用一次视图?

2 个答案:

答案 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的新实例。