自定义 Vaadin 导航器 [英] Customize Vaadin Navigator
本文介绍了自定义 Vaadin 导航器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我只是扩展了 Vaadin 的导航器并覆盖了一些方法:
I just extended Vaadin's navigator and overriden some some methods:
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>
}
}
这是我设置导航器的方式:
This is how I set up Navigator:
@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);
}
}
这就是我尝试获取导航器并将视图重定向到另一个的方式:
And this is how i attempt to get navigator and redirect view to another:
@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){
}
}
出于某种原因,按钮对点击事件没有反应.
And for some reason, button doesn't react to click event.
替换为标准导航器 - 有效.
Replacing to standard Navigator - it works.
我做错了什么?
感谢您的建议
推荐答案
我原以为你可以像这样使用 Vaadin 的 Navigator 和 View Change Listener:
I would have thought that you could use Vaadin's Navigator and a View Change Listener like this:
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,它将停止发生视图更改.
If you return false in the beforeViewChange it will stop the view change from happening.
这篇关于自定义 Vaadin 导航器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文