0

我在我的 GXT 项目中实现了 MVP 模式。该系统将客户注册为其功能的一部分。系统用户也可以搜索提供 id 的注册用户。

我在“搜索客户”按钮中添加了一个 OnClick 事件。

/* On click search button */
        view.getBtnSearch().addListener(Events.OnClick, new Listener<BaseEvent>() {
            @Override
            public void handleEvent(BaseEvent be) {
                eventBus.fireEvent(new CustomerRegistrationTabSelectionEvent(0, false));
                eventBus.fireEvent(new CustomerFetchEvent(view.getValueCustSearchParameter(), view.getValueCustSearchValue(), true));
            }
        });

CustomerRegistrationTabSelectionEvent 会选择相关选项卡并启用其他选项卡。这就是它所做的一切。

这是自定义事件 CustomerFetchEvent 的处理程序。

eventBus.addHandler(CustomerFetchEvent.TYPE, new CustomerFetchEventHandler() {
            @Override
            public void fetchCustomer(CustomerFetchEvent event) {
                searchCustomer(event.getParameter(), event.getParameterValue(), event.isOpenFirstTab()); 
            }
        });

问题是多次执行搜索客户方法,如果搜索无效,错误消息对话框会显示多个弹出窗口。在 searchCustomer 方法中,我调用服务来获取客户数据或在搜索无效时显示弹出错误消息。

我使用 GXT 2.2.5 和 JRE 1.6。

谁能帮我找出为什么代码被多次执行?

稍后添加:当我第一次运行应用程序时,代码只执行一次,因此只有 1 个弹出窗口。然后我注销系统并再次登录(导航到存在“搜索客户”按钮的同一页面。)并且代码执行了两次。同样等于我创建/导航到特定页面的次数,代码执行。每次我重新创建页面时,它实际上是否添加了事件处理程序代码而不删除最后一个?

4

2 回答 2

0

是的,似乎“addHandler”多次添加处理程序,但存储了以前的上下文。您的代码应该只在初始化阶段添加一次处理程序。您可以使用“getHandlerCount”方法检查处理程序的数量。

于 2012-08-12T20:29:27.480 回答
0

是的。我修好了!这是解 绑 GWT 中必需的演示者的解决方案

你可以在这里阅读更多。http://draconianoverlord.com/2010/11/23/gwt-handlers.html

实际发生的是,我向 HandlerManager 注册以接收事件的演示者对象没有被垃圾收集。因为尽管我删除了对演示者的引用,但 HandlerManager 仍然持有对这些对象的引用。所以每次我都在同一个班级的老演讲者之上不断地创造新的演讲者。所以一个事件被同一个类的多个对象监听。所以你需要通过删除 HandlerManager 中注册的处理程序来确保未使用的演示者被垃圾收集。

于 2012-08-16T08:30:48.447 回答