来自gwt-platform的操作被执行多次

时间:2012-07-11 18:06:12

标签: google-app-engine session objectify gwt-platform

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

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

在我的应用程序中,我基于gwt-platform中的Dispatch模块,一个Login操作和一个Logout模块。

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

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

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

1 个答案:

答案 0 :(得分:4)

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

EventHandler方法中的onReset()移出onBind()方法,因为onBind()仅在演示者的生命周期中调用一次,而且您应该在此处调用EventHandlers添加registerHandler()。除此之外,还将其包装到onUnbind()方法中,以便在调用@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(); } 时自动删除它。

<强> FirstApplicationPresenter.java

{{1}}