在我的AngularJS应用程序的一个页面中,我想显示用户是否单击浏览器后退按钮确认:
所以我在stateChange上添加了一个监听器来检测这种行为,如果用户不想回去,我就取消它。
这是我的代码:
angular
.module('app.platform')
.run(start);
start.$inject = ['$rootScope', '$state'];
function start ($rootScope, $state) {
// Save navigation
$rootScope.previousState = null;
// State change listener
$rootScope.$on('$stateChangeStart', stateChangeStartListener);
function stateChangeStartListener(event, toState, toParams, fromState, fromParams) {
// app.platform.quiz is the state that I want to display a confirm if the user
// uses the back button
// Then I record and check the previous state reached to know that the user uses the back button
if(fromState.name === 'app.platform.quiz'
&& $rootScope.previousState
&& $rootScope.previousState === toState.name) {
if(confirm("Do you really want ot leave the quiz ?")) {
$rootScope.previousState = fromState.name;
$state.go(toState, toParams);
} else {
event.preventDefault();
}
} else {
$rootScope.previousState = fromState.name;
}
}
}
当用户点击确定按钮时效果很好,但当他点击取消时,我的行为很奇怪。他留在页面上,但是如果他再次按下后退按钮就没有任何事情发生(没有确认,没有回去),如果他再次按下按钮,他会回到2状态。
听起来我的event.preventDefault()
混乱了历史。
我对HTML5 History API不太熟悉,但也许它可以解决我的问题。
你知道我做错了什么吗?或者为什么我得到这种行为(以及如何纠正它)。
经过一些阅读(来自评论),我知道问题是什么,以及如何解决(仅在理论上)。
我需要在更改网址之前抓住后退按钮点击,但我认为这是不可能的。