【问题标题】: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 将被多次添加并因此执行多次(与您打开演示者的次数成正比)。

    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();
    }            
    

    【讨论】:

    • 非常感谢。这是正确的答案。任何帮助表示赞赏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多