1

我正在使用 gwt-platform、objectify 和 appengine (java)。

我正在尝试在最佳实践之后创建用户和会话管理系统。我希望这是应用程序中的可重用模块。

在我的应用程序中,我有一个基于 gwt-platform 中的 Dispatch 模块、一个登录操作和一个注销操作。

当我进入应用程序时,会出现登录屏幕,一切正常。如果我在演示者之间导航,然后按下注销按钮,我会看到注销操作被执行了多次,或者与此相关的任何其他操作。一个动作的执行次数(应该只运行一次)似乎与我在演示者之间导航的次数成正比。

该项目的源代码托管在:http ://code.google.com/p/gwt-platform-appengine-session-login-example/

如果有人能给我一些错误的提示,那就太好了。此外,如果有人也想为该项目做出贡献,我们将不胜感激。请发电子邮件给我。

4

1 回答 1

4

问题是您在onReset()方法中为 Logout 按钮添加了 EventHandler。
但是,如果您查看 GWTP 文档,onReset()则每当您导航到演示者时都会调用该方法。因此,如果您多次导航到演示者,EventHandler则会多次添加并因此执行多次(与您打开演示者的次数成正比)。

将方法EventHandleronReset()移到onBind()方法中,因为onBind()在演示者的生命周期中只调用一次,并且它是您应该添加的地方EventHandlers。除此之外,将其包装到registerHandler()方法中,以便在onUnbind()调用时自动将其删除。

FirstApplicationPresenter.java

@Override
protected void onBind() {
    super.onBind();
    getView().getLogoutBtn().setText("Logout "+username);
    registerHandler(getView().getLogoutBtn().addClickHandler(new ClickHandler() {
        @Override
            public void onClick(ClickEvent event) {
                Logout action = new Logout();
                dispatchAsync.execute(action, logoutCallback);
            }
    }));
}

@Override
protected void onReset() {
    super.onReset();
}            
于 2012-07-12T14:23:27.783 回答