开发者社区> 问答> 正文

如何将MainView注册到另一个View触发的ComponentEvent?

如何将MainView注册到另一个View触发的事件?

我已经尝试过ComponentUtil.addListener(),但它对我不起作用。另一方面,我什至不确定是否在MainView可以注册到事件的点创建触发事件的View?

申请流程:

打开应用程序-> MainView->如果用户未通过身份验证,则重新路由-> LoginView-> SuccessfulAuthenticationEvent-> MainView对SuccessfulAuthenticationEvent触发的内容做出反应LoginView

事件:

public class SuccessfulAuthenticationEvent extends ComponentEvent<LoginForm> {
    public SuccessfulAuthenticationEvent(LoginForm source, boolean fromClient) {
        super(source, fromClient);
    }
}

主视图:

public class MainView extends AppLayout implements ComponentEventListener<SuccessfulAuthenticationEvent> {
    ...
    @Override
    public void onComponentEvent(SuccessfulAuthenticationEvent event) {
        System.out.println("SuccessfulAuthenticationEvent catched");
    }
}

登录视图:

public class LoginView extends Div {
    ...
    @Override
    public void executeAfterAuthentication() {
        fireEvent(new SuccessfulAuthenticationEvent(loginForm, false));
    }
}

问题来源:Stack Overflow

展开
收起
montos 2020-03-21 20:53:03 1149 0
1 条回答
写回答
取消 提交回答
  • 我将使用其他方法,这种方法更可靠。

    在“登录”视图中。如果登录成功,则保存指示用户已登录的会话属性,例如:

    VaadinSession.getCurrent().setAttribute("userLoggedIn", true);
    

    在您的MainLayout中实现BeforeEnterObserver和重写beforeEnter方法。在beforeEnter方法中读取会话属性(如果为null),将其转发到登录页面。

    @Override
    public void beforeEnter(BeforeEnterEvent event) {
        if (VaadinSession.getCurrent().getAttribute("userLoggedIn") == null) {
            event.forwardTo(LoginView.class);
        }
    }
    

    额外的小费。在beforeEnter方法中,您还可以存储当前路线,如果登录成功,则可以在登录视图中重新路由到存储的路线。

    @Override
    public void beforeEnter(BeforeEnterEvent event) {
        if (VaadinSession.getCurrent().getAttribute("userLoggedIn") == null) {
            VaadinSession.getCurrent().setAttribute("intendedPath", event.getLocation().getPath());
            ...
        }
    }
    

    并在成功登录后进入登录视图

    Object intendedPath = VaadinSession.getCurrent().getAttribute("intendedPath");
    UI.getCurrent().navigate(Optional.ofNullable(intendedPath).map(Object::toString).orElse(""));
    

    回答来源:Stack Overflow

    2020-03-21 20:59:36
    赞同 展开评论 打赏
问答分类:
API
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载