ui-路由器:不使用 $state.go() 重置 $state

ui-router: Reset $state without using $state.go()

首先,我认为这里的总体问题是 AngularJS 仍然没有 "restarting" 应用程序及其所有组件的合理、最佳实践方式。到目前为止,最佳做法似乎是将路径设置为 "default" 视图,然后重新加载 window。我们在 /logout 状态下执行此操作,如下所示:

$stateProvider.state('logout', {
    onEnter: function($state, $window, store) {
        //Remove any session variables
        store.remove('varA');
        store.remove('varB');

        //"Logout" the user
        $state.go('login');
        $window.location.reload();
    }
})

但是,这是一种糟糕的用户体验。在 window 重新加载之前,用户实际上可以看到视图更改和页面上的组件移动。总的来说,它看起来很糟糕。

本来我们没有包含$state.go('login'),也没有得到注销前看到视图变化的怪异体验。然而,当我们开始使用像 $rootScope.$on('$stateChangeStart', function (event, toState, toParams) 这样的 $state 处理程序时,我们注意到 toState 在 window 重新加载后没有被重置。因此 $stateChangeStart 将在重新加载后触发,并且 toState 仍将设置为用户在调用 /logout 之前所在的任何视图。这不是真正的应用重置!

可能的解决方案: 我认为如果有一种方法可以 "reset $state" 而不使用 $state.go() 方法,那么所有这些都可以解决...而是发生在幕后。

简单的代码更改为我修复了它

//"Logout" the user
$state.go('login', null, {notify: false}).then(function() {
    $window.location.reload();
});

来源:https://github.com/angular-ui/ui-router/issues/2486#issuecomment-180872463