后退按钮确认在AngularJS应用

时间:2016-11-08 19:11:35

标签: angularjs angular-ui-router back-button

在我的AngularJS应用程序的一个页面中,我想显示用户是否单击浏览器后退按钮确认:

enter image description here

所以我在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不太熟悉,但也许它可以解决我的问题。

你知道我做错了什么吗?或者为什么我得到这种行为(以及如何纠正它)。

编辑:

经过一些阅读(来自评论),我知道问题是什么,以及如何解决(仅在理论上)。

我需要在更改网址之前抓住后退按钮点击,但我认为这是不可能的

0 个答案:

没有答案