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;
}

SelectionHandlerが複数回トリガーされるのを防ぐために、ローカルのenabledSelectionHandlerを使用しない他の適切な方法はありますか?

4

1 に答える 1

2

TabLayoutPanelパネルの動作は正しいです。clearを呼び出すとき、TabLayoutPanelは各タブを1つずつ削除します。タブを削除すると、最後のタブが選択され、選択イベントが送信されます。したがって、n個の要素を持つTabLayoutPanelをクリアすると、n-1個の選択イベントが発生するはずです。

あなたの解決策は良いと思いますが、おそらくハンドラー登録を使用してイベントのリッスンを有効/無効にすることができます

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

また、BeforeSelectionEventを使用してイベントを有効/無効にすることを検討してください

于 2013-04-25T15:04:21.717 に答える