0

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

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

申请流程:

打开应用程序 -> MainView-> 如果用户未通过身份验证,则重新路由 -> LoginView-> SuccessfulAuthenticationEvent->MainViewSuccessfulAuthenticationEvent触发的响应做出反应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));
    }
}
4

1 回答 1

2

我会使用更强大的不同方法。

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

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

在您的 MainLayout 实现BeforeEnterObserver和覆盖beforeEnter方法。在beforeEnter方法中读取会话属性,如果为空则转发到登录页面。

@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(""));
于 2020-03-17T06:49:49.140 回答