Использование onBeforeUnload портит историю браузеров в Angular

Когда пользователь закончит ввод данных на странице, я хочу, чтобы они вернулись на предыдущую страницу (например, Главная страница -> Страница ввода). Если я перенаправляю их, когда они нажимают «Отправить», я получаю круговую историю (Главная страница -> Страница ввода -> Главная страница). Следовательно, когда пользователь нажимает кнопку «Отправить», я вызываю window.history.back().

Чтобы предотвратить потерю данных, я прослушиваю событие beforeUnload. Если пользователь не отправил форму, я предлагаю убедиться, что он знает, что он потеряет свои изменения.

Проблема, с которой я сталкиваюсь, заключается в том, что если пользователь попытается вернуться, не отправив свои данные, нажмите «Отмена», чтобы остаться на странице, а затем нажмите «Отправить». 1-й раз, когда они наносят ответный удар, отменяется, а затем после отправки я выполняю history.back(), но в итоге это возвращает 2 записи в истории вместо 1. Это почти так, как если бы я отменил событие возврата, что предыдущий URL (Главная страница) полностью удаляется из стека истории. Следовательно, нажатие кнопки «Отправить» проходит мимо этой страницы и возвращается на страницу «Новая вкладка».

Я знаю, что управление стеком безумно сложно, но не могу понять, как перейти к предыдущему URL-адресу, если пользователь отменяет onBeforeUnload, чтобы остаться на странице, и отправляются обращения. Кажется, если пользователь отменит его, когда я вызову history.back(), он должен вернуться на главную страницу.


person Brian Bauman    schedule 19.09.2018    source источник


Ответы (1)


Я обнаружил, что моя проблема связана с Angular, о котором я забыл упомянуть в вопросе. Похоже, навигация Angular перестает работать, когда защита CanDeactivate отменяет навигацию. Существует предложенный обходной путь, который, кажется, работает для меня.

person Brian Bauman    schedule 20.09.2018