如何将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
我将使用其他方法,这种方法更可靠。
在“登录”视图中。如果登录成功,则保存指示用户已登录的会话属性,例如:
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。