Скрытие диалогов при изменении history

Рейтинг: 2Ответов: 2Опубликовано: 15.02.2011

В проекте есть несколько history-item, на которые может переходить пользователь. Когда пользователь переходит с address#itemA на address#itemB, диалоги с прошлой страницы истории остаются. Как исправить этот недостаток?

Ответы

▲ 3Принят

Для этого есть метод setAutoHideOnHistoryEventsEnabled.

Внутри PopupPanel скрытие диалогов реализовано так, как написал cy6erGn0m (см. метод updateHandlers). При появлении диалога добавляется слушатель истории и сохраняется его HandlerRegistration, при исчезании диалога слушатель истории удаляется через этот HandlerRegistration.

// Remove any existing handlers.
if (historyHandlerRegistration != null) {
  historyHandlerRegistration.removeHandler();
  historyHandlerRegistration = null;
}
...
// Create handlers if showing.
if (showing) {
  ...
  historyHandlerRegistration = 
    History.addValueChangeHandler(new ValueChangeHandler<String>() {
    public void onValueChange(ValueChangeEvent<String> event) {
      if (autoHideOnHistoryEvents) {
        hide();
      }
    }
  });
}
▲ 2

Создайте HistoryListener и добавьте его History.addHistoryListener(myListener); У интерфейса предусмотрено событие onHistoryChanged. По этому событию вам придётся закрывать/открывать необходимые диалоги..

UPD1:

Ну так это зависит от того, каким образом вы эти диалоги создаёте и от того, какой паттерн вы применяете. В случае MVP вполне можно presenter подписать на историю и при переходе на элемент истории, не связанный с диалогом, диалог может совершить суицид :)

А можно сделать какой-нибудь DialogManager, который бы знал обо всех открытых диалогах и грохал ненужные в случае чего.