我使用的是gwt平台、objectify和appengine(java)。
我正在尝试根据最佳实践创建一个用户和会话管理系统。我希望这是应用程序中的一个可重用模块。
在我的应用程序中,基于gwt平台中的Dispatch模块,我有一个Login操作和一个Logout操作。
当我进入应用程序时,登录屏幕出现,一切正常。如果我在演示者之间导航,然后按下注销按钮,我会看到注销操作被执行了多次,或者执行了任何其他操作。一个Action(应该只运行一次)的执行次数似乎与我在演示者之间导航的次数成正比。
项目的源代码位于:http://code.google.com/p/gwt-platform-appengine-session-login-example/
如果有人能告诉我出了什么问题,那就太好了。此外,如果有人也愿意为该项目做出贡献,我们将不胜感激。请给我发电子邮件。
问题是在onReset()
方法中为Logout按钮添加EventHandler
但是,如果检查GWTP文档,则每当导航到演示者时都会调用onReset()
方法。因此,如果您多次导航到演示器,EventHandler
将被添加多次,从而被执行多次(与您打开演示器的次数成正比)。
将EventHandler
从onReset()
方法移到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();
}