自定义 Vaadin 导航器 [英] Customize Vaadin Navigator

查看:30
本文介绍了自定义 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆