2017-08-27 44 views
0

我想在同一窗口選項卡中顯示不同的頁面。我使用Empty和Empty1類。類Empty是一個主頁面,視圖Empty1被加載到Empty中。當我使用Navigator和SpringViewProvider時,爲什麼頁面會被加載兩次?

稱爲空類:

@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() 
    } 
} 

當我打開新的窗口,我看到一句話「這是默認的視圖」和它的確定。 但是,當我看到trackstace時,我注意到顯示了兩次的句子「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

它發生的原因是因爲您在Empty.init()方法中調用Navigator.navigateTo()。每個導航操作都會創建新的視圖bean實例(視圖不是單例)。在您致電Navigator.navigateTo()後,它將在UI.doInit()方法中再次調用,這會導致創建第二個bean。

如果你想使你的「empty1」查看默認視圖(如果在URL沒有指定其他視圖,顯示了一個),那麼這樣的事情應該工作:

if ("".equals(navigator.getState())) { 
    getPage().setUriFragment("!" + Empty1.VIEW_NAME, false); 
} 

當然你也可以將視圖命名爲""以使其成爲默認值。

+0

我在'Empty'類的末尾添加了您建議的片段代碼。我評論navigator.navigateTo(...)線,但它不起作用。這個問題的描述如下: java.lang.IllegalArgumentException:嘗試導航到未知狀態''和錯誤視圖提供程序不存在路徑:/空 – Fisherek15

+0

我編輯了一些問題,也許現在我更好地解釋我想要的東西去做。 – Fisherek15

+0

我已經更新了代碼,它現在應該可以工作(它適用於vaadin 8.0.5)。 –

相關問題