2016-11-24 74 views
0

我只是延长Vaadin的导航和重写一些一些方法:定制Vaadin导航

public class MyNavigator extends Navigator { 

final SpringViewProvider viewProvider; 

public MyNavigator(UI ui, SingleComponentContainer container, SpringViewProvider viewProvider) { 
    super(ui, container); 
    this.viewProvider = viewProvider; 
    addProvider(this.viewProvider); 
} 

@Override 
public void navigateTo(String navigationState) { 
    if(ViewTokens.AVAILABLE_TOKENS.contains(navigationState)) { 
     if(viewProvider.getView(navigationState) == null) { 
      String uriFragment = parseViewToken(); 
      if(uriFragment.equals(navigationState)) { 
       super.navigateTo(ViewTokens.HOME); 
      } 
     } else { 
      //if nothing found, redirect 
      super.navigateTo(ViewTokens.HOME); 
     } 
    } 
} 

private String parseViewToken() { 
    <ommitted> 
} 

}

这是我如何设置导航:

@SpringUI(path="/") 
@Theme(ValoTheme.THEME_NAME) 
public class MyFancyUI extends UI { 

@Autowired 
SpringViewProvider viewProvider; 

@Override 
protected void init(VaadinRequest vaadinRequest) { 
    MyNavigator navigator = new MyNavigator(UI.getCurrent(), this, viewProvider); 
    setNavigator(navigator); 
    navigator.navigateTo(ViewTokens.SIGNIN); 
} 

}

而且这是我如何获得导航器并将视图重定向到另一个:

@UIScope 
@SpringView(name=ViewTokens.HOME) 
public class SplashScreen extends VerticalLayout implements View { 
private ComponentHelper componentHelper; 
private Button toLoginPage; 

public SplashScreen() { 
    initComponents(); 
    buildSplashView(); 
} 

protected void initComponents() { 
    componentHelper = ComponentHelper.getInstance(); 
    toLoginPage = componentHelper.createFriendlyButton("To Login Page",220, 60); 
    toLoginPage.addClickListener(this::redirect); 
} 

private void buildSplashView() { 
    addComponent(toLoginPage); 
    setComponentAlignment(toLoginPage, Alignment.MIDDLE_CENTER); 
    setHeight(100, Unit.PERCENTAGE); 
} 

public void redirect(Button.ClickEvent event) { 
    getUI().getNavigator().navigateTo(ViewTokens.SIGNIN); 
} 

@Override 
public void enter(ViewChangeListener.ViewChangeEvent viewChangeEvent){ 

} 
} 

由于某种原因,按钮不响应点击事件。

替换为标准导航器 - 它的工作原理。

我做错了什么?

感谢建议

+0

您应该查看视图更改侦听器。你不需要重写导航器。我会张贴一些代码,但我今天不在我的电脑附近。 –

+0

@ChrisM听起来很有趣,我会继续关注。 – Reborn

+0

还有SpringNavigator类,其中包括SpringViewProvider。 – nyg

回答

1

我还以为你可以使用Vaadin的导航和查看变化监听这样的:

 navigator.addViewChangeListener(new ViewChangeListener() { 

     @Override 
     public boolean beforeViewChange(ViewChangeEvent event) { 
      // check you're happy to change 

      if (ViewTokens.AVAILABLE_TOKENS.contains(navigationState)) { 
       if (viewProvider.getView(event.getViewName()) == null) { 
        String uriFragment = parseViewToken(); 
        if (uriFragment.equals(event.getViewName())) { 
         navigator.navigateTo(ViewTokens.HOME); 
         return false; 
        } 
       } else { 
        // if nothing found, redirect 
        navigator.navigateTo(ViewTokens.HOME); 
        return false; 
       } 
       // Let the view change happen. 
       return true; 
      } 

     } 

     @Override 
     public void afterViewChange(ViewChangeEvent event) { 

     } 
    }); 

如果您在beforeViewChange返回false将停止从视图改变发生。

+0

这是假设要在每个视图中指定,我使用或什么? – Reborn

+1

不,您在创建时将其添加到导航器中。我犯了一个错误,我会在一秒之内改变。 –

+0

啊,呃!谢谢,关于干净的代码(我想使UI.init()尽可能清洁)如果我想使自己的ViewChangeListener实现,那么如何从导航器中获取导航状态?(如果可能的话) – Reborn