現在、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;
}
SelectionHandlerが複数回トリガーされるのを防ぐために、ローカルのenabledSelectionHandlerを使用しない他の適切な方法はありますか?