В нашем приложении нам нужно проверить, сохраняются ли данные, когда мы находимся в определенном месте, прежде чем уйти от него. Таким образом, пользователь должен иметь возможность отменить запрос кнопки «Назад» в браузере. Но к моменту получения события изменения значения истории URL-адрес уже был изменен. У класса History, похоже, нет способа восстановить URL-адрес. У кого-нибудь есть идеи?
Как показать предыдущий URL-адрес после того, как пользователь отменил диалог с сообщением от Activity#mayStop()?
Ответы (5)
В GWT 2.1 вы получаете действия и места. И активность имеет maystop, и это именно то, что вам нужно, если я правильно вас понимаю.
Используйте обратный вызов window.onunload
или window.onbeforeunload
javascript для подтверждения/сохранения состояния. пример onbeforeunload
На самом деле я еще не реализовал это поведение, но вот мой план, и, возможно, он сработает для вас.
1) Каждый раз, когда вы получаете событие onHistoryChanged и решаете его разрешить, сохраняйте где-нибудь текущий historyToken в переменной экземпляра.
2) Отслеживайте активность на странице, которая должна блокировать навигацию. Используйте структуру данных, которая может отслеживать несколько действий, таких как загрузка нескольких файлов, несколько изменений и т. д.
3) Когда вы получаете новое событие onHistoryChanged, если ваша структура данных из № 2 указывает на то, что навигация небезопасна, избегайте изменения страницы и восстановите historyToken, который вы сохранили в № 1. Я предполагаю, что вы можете сделать это либо:
а) Вызов History.newItem(oldHistoryToken, false) или
b) Вызов History.newItem(oldHistoryToken, true) и сохранение флага для принудительного игнорирования следующего onHistoryChanged.
Опять же, я на самом деле не реализовал это, поэтому дайте мне знать, как это работает.
Если у вас есть ссылки, которые позволяют пользователю покинуть приложение, и вы также хотите предотвратить это, вам также необходимо добавить onbeforeunload.
Взгляните на PlaceManagerImpl
из класса gwt-platform framework. Особенно метод onValueChange()
и методы, работающие с полем onLeaveQuestion
.
Надеюсь, это поможет.
В этом отчете о проблеме t.broyer объясняет в своем комментарии такое поведение запланировано во время разработки структуры Places. Самая важная часть:
mayStop был ошибкой, или его нужно было вызывать только при выгрузке приложения, а не для внутренней навигации в приложении.
Так что, наверное, лучше его вообще не использовать...