目前我正在使用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被多次触发?
答案 0 :(得分:2)
TabLayoutPanel面板的行为是正确的。当您调用清除TabLayoutPanel时,逐个删除每个选项卡。当您删除标签时,会选择最后一个标签 - &gt;发送选择事件。因此,当您清除带有n个元素的TabLayoutPanel时,您应该引发n-1个选择事件。
我认为您的解决方案很好,但也许您可以使用处理程序注册来启用/禁用侦听事件
final HandlerRegistration registration = tabPanel.addSelectionHandler(this);
registration.removeHandler();
另外考虑使用BeforeSelectionEvent来启用/禁用事件