我正在使用gwt-platform,objectify和appengine(java)。
我正在尝试在最佳实践后创建用户和会话管理系统。我希望这是应用程序中的可重用模块。
在我的应用程序中,我基于gwt-platform中的Dispatch模块,一个Login操作和一个Logout模块。
当我进入应用程序时,会出现登录屏幕,一切正常。如果我在演示者之间导航,之后按下“注销”按钮,我会看到注销操作多次执行,或者其他任何操作。 一个Action的执行次数(应该只执行一次)似乎与我在演示者之间导航的次数成正比。
项目的源代码托管在:http://code.google.com/p/gwt-platform-appengine-session-login-example/
如果有人能给我一些有关错误的提示,那就太好了。此外,如果有人也想为该项目做出贡献,我们将不胜感激。请给我发电子邮件。
答案 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}}