目前我正在使用 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 被多次触发?