Как показать предыдущий URL-адрес после того, как пользователь отменил диалог с сообщением от Activity#mayStop()?

В нашем приложении нам нужно проверить, сохраняются ли данные, когда мы находимся в определенном месте, прежде чем уйти от него. Таким образом, пользователь должен иметь возможность отменить запрос кнопки «Назад» в браузере. Но к моменту получения события изменения значения истории URL-адрес уже был изменен. У класса History, похоже, нет способа восстановить URL-адрес. У кого-нибудь есть идеи?


person Bill Lyons    schedule 11.11.2010    source источник


Ответы (5)


В GWT 2.1 вы получаете действия и места. И активность имеет maystop, и это именно то, что вам нужно, если я правильно вас понимаю.

person Gipsy King    schedule 12.11.2010

Используйте обратный вызов window.onunload или window.onbeforeunload javascript для подтверждения/сохранения состояния. пример onbeforeunload

person Josiah Ruddell    schedule 11.11.2010
comment
К сожалению, на самом деле мы не меняем страницы, а просто отображаем разные части одной и той же страницы. - person Bill Lyons; 12.11.2010

На самом деле я еще не реализовал это поведение, но вот мой план, и, возможно, он сработает для вас.

1) Каждый раз, когда вы получаете событие onHistoryChanged и решаете его разрешить, сохраняйте где-нибудь текущий historyToken в переменной экземпляра.

2) Отслеживайте активность на странице, которая должна блокировать навигацию. Используйте структуру данных, которая может отслеживать несколько действий, таких как загрузка нескольких файлов, несколько изменений и т. д.

3) Когда вы получаете новое событие onHistoryChanged, если ваша структура данных из № 2 указывает на то, что навигация небезопасна, избегайте изменения страницы и восстановите historyToken, который вы сохранили в № 1. Я предполагаю, что вы можете сделать это либо:

а) Вызов History.newItem(oldHistoryToken, false) или

b) Вызов History.newItem(oldHistoryToken, true) и сохранение флага для принудительного игнорирования следующего onHistoryChanged.

Опять же, я на самом деле не реализовал это, поэтому дайте мне знать, как это работает.

Если у вас есть ссылки, которые позволяют пользователю покинуть приложение, и вы также хотите предотвратить это, вам также необходимо добавить onbeforeunload.

person andykellr    schedule 12.11.2010
comment
Я реализовал что-то в этом роде. Первоначально я думал, что в стеке истории будут дубликаты токенов, но, видимо, код истории достаточно умен, чтобы этого не делать. - person Bill Lyons; 12.11.2010
comment
Что я на самом деле делаю, так это отслеживаю текущий URL-адрес (на самом деле просто токен истории), когда я делаю History.newItem, у меня есть класс-оболочка, который делает это. Когда пользователь отменяет событие навигации, я просто добавляю вызов History.newItem (с ложным параметром) с последним сохраненным токеном. Итак, проблема решена, всем спасибо. - person Bill Lyons; 12.11.2010

Взгляните на PlaceManagerImpl из класса gwt-platform framework. Особенно метод onValueChange() и методы, работающие с полем onLeaveQuestion.

Надеюсь, это поможет.

person z00bs    schedule 12.11.2010
comment
В принципе, это то, что я в итоге сделал. Спасибо за ссылку на браузер исходного кода, я всегда забываю, что он доступен. - person Bill Lyons; 12.11.2010

В этом отчете о проблеме t.broyer объясняет в своем комментарии такое поведение запланировано во время разработки структуры Places. Самая важная часть:

mayStop был ошибкой, или его нужно было вызывать только при выгрузке приложения, а не для внутренней навигации в приложении.

Так что, наверное, лучше его вообще не использовать...

person MeTTeO    schedule 02.08.2012