TabLayoutPanel选择处理程序多次触发

时间:2012-10-24 08:53:35

标签: gwt uibinder gwt-tablayoutpanel

目前我正在使用GWT TabLayoutPanel并遇到一些问题。 我的应用程序使用“活动和位置”来管理浏使用TabLayoutPanel我试图通过在onSelectionHandler()事件中执行placeController.goTo()来将历史记录存储在历史记录中(以便我可以在浏览器上移回)。我正在刷新Tabs列表做tabLayoutPanel.clear()。 问题是tabPanel.clear()多次触发selectionHandler,因此我的Places触发了很多次。 为了解决这个问题,我不得不添加本地启用和禁用SelectionHandler,但这对我来说不合适。

以下是代码示例。我正在使用addEvents方法刷新某些事件的标签列表。

@UiField
TabLayoutPanel tabPanel;
private Boolean enabledSelectionHandler = true;
...
    public EventsPageImpl(EventBus bus, final PlaceController placeController) {
        initWidget(uiBinder.createAndBindUi(this));
        tabPanel.addSelectionHandler(new SelectionHandler<Integer>() {
            @Override
            public void onSelection(SelectionEvent<Integer> event) {
                if (enabledSelectionHandler) {
                    if (eventsList.size() > 0 && event.getSelectedItem() != 0) {
                        placeController.goTo(new EventsPlace(eventsList.get(event.getSelectedItem() - 1).getId().toString()));
                    } else {
                        placeController.goTo(new EventsPlace(null));
                    }
                }


}
    });
...
}

@Override
public void addEvents(List<ClientEvent> events) {
    enabledSelectionHandler = false;
    tabPanel.clear();
    tabPanel.add(new EventsTab(presenter), CommonMessages.INSTANCE.createNewEvent());
    if (eventsList.size() == 0 && events.size() > 0) {
        for (ClientEvent event : events) {
            eventsList.add(event);
        }
    }
    for (ClientEvent event : eventsList) {
        tabPanel.add(new EventsTab(event, presenter), event.getTitle());
    }
    enabledSelectionHandler = true;
}

是否有其他正确的方法没有使用本地enabledSelectionHandler来防止SelectionHandler被多次触发?

1 个答案:

答案 0 :(得分:2)

TabLayoutPanel面板的行为是正确的。当您调用清除TabLayoutPanel时,逐个删除每个选项卡。当您删除标签时,会选择最后一个标签 - &gt;发送选择事件。因此,当您清除带有n个元素的TabLayoutPanel时,您应该引发n-1个选择事件。

我认为您的解决方案很好,但也许您可以使用处理程序注册来启用/禁用侦听事件

final HandlerRegistration registration = tabPanel.addSelectionHandler(this);
registration.removeHandler();

另外考虑使用BeforeSelectionEvent来启用/禁用事件