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
首先,我认为这里的总体问题是 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