В GWT, как сбросить URL, когда пользователь нажимает кнопку "Отмена" в диалоговом окне подтверждения навигации?


В моем приложении GWT я хочу попросить подтверждение пользователя, когда он выходит из текущего приложения, т. е., введя URL-адрес или закрыв браузер. Обычно это делается путем регистрации ClosingHandler и установки нужного диалогового сообщения в методе onWindowClosing. Это, кажется, хорошо работает.

Однако, если пользователь пытается перейти, скажем, к http://www.gmail.com (введя его в строке URL) и нажимает отмена , чтобы указать, что он не хочет перемещаться, то мое приложение продолжает работать, но в строке URL браузера постоянно отображается http://www.gmail.com. Это вызывает ряд проблем позже в моем приложении и даст неправильный результат, если пользователь закладывает страницу.

Есть ли способ автоматически сбросить URL-адрес, когда пользователь нажимает кнопку Cancel ?

Или, в качестве альтернативы, есть ли способ обнаружить, что пользователь нажал кнопкуCancel ? Если да, то есть ли способ задать URL-адрес, не вызывая ValueChangeEvent? (Я мог бы добавить некоторую логику, чтобы предотвратить это, но я бы предпочел использовать встроенный механизм, если он существует.)

3   4   2010-03-01 21:11:26

3 ответа:

Не уверен, что это работает, но вы пытались: History.newItem(History.getToken(), false); сбросить URL? Он устанавливает маркер истории, не вызывая новый элемент истории.

Мне это удалось. Похоже, что команды GWT DeferredCommand выполняются после закрытия окна подтверждения. Это, в сочетании с ответом Хилбранда выше, дает мне именно то, что я хочу. Вот именно то, что я делаю:

  public final void onWindowClosing(Window.ClosingEvent event) {
    event.setMessage(onLeaveQuestion);
    DeferredCommand.addCommand( new Command() {
      public void execute() {
        Window.Location.replace(currentLocation);
      }
    });
  }

, где currentLocation получается вызовом Window.Location.getHref() при каждом изменении маркера истории.

Я решил эту проблему, создав пользовательский PlaceController и заменив маркер в url. Не идеальное решение, но оно работает!

if (warning == null || Window.confirm(warning)) { where = newPlace; eventBus.fireEvent(new PlaceChangeEvent(newPlace)); currentToken = History.getToken(); } else { // update the url when user clicks cancel in confirm popup. History.replaceItem(currentToken, false); }