1

目前我正在使用 GWT TabLayoutPanel 并遇到了一些问题。我的应用程序使用活动和地点来管理浏览器历史记录。使用 TabLayoutPanel,我试图通过在 onSelectionHandler() 事件中执行 placeController.goTo() 将选项卡存储在历史记录中(以便我可以返回浏览器)。我正在刷新选项卡列表执行 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 被多次触发?

4

1 回答 1

2

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

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

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

还可以考虑使用 BeforeSelectionEvent 启用/禁用事件

于 2013-04-25T15:04:21.717 回答