【问题标题】:Actions from gwt-platform are executed multiple times来自 gwt-platform 的操作被执行多次
【发布时间】:2012-07-11 18:06:11
【问题描述】:
我正在使用 gwt-platform、objectify 和 appengine (java)。
我正在尝试在最佳实践之后创建用户和会话管理系统。我希望这是应用程序中的可重用模块。
在我的应用程序中,基于 gwt-platform 中的 Dispatch 模块,我有一个登录操作和一个注销操作。
当我进入应用程序时,会出现登录屏幕,一切正常。如果我在演示者之间导航,然后按下注销按钮,我会看到注销操作被执行了多次,或者与此相关的任何其他操作。
Action 的执行次数(应该只运行一次)似乎与我在演示者之间导航的次数成正比。
项目源代码托管于:http://code.google.com/p/gwt-platform-appengine-session-login-example/
如果有人可以给我一些错误提示,那就太好了。此外,如果有人也想为该项目做出贡献,我们将不胜感激。请给我发电子邮件。
【问题讨论】:
标签:
google-app-engine
session
objectify
gwt-platform
【解决方案1】:
问题是您在 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();
}