我需要在用户/general
到/boards
时重定向用户。我正在使用$state.go('boards')
来实现它,但它只有在我将它包装在setTimeout
函数中时才有效,即使没有延迟。
为什么会出现这种情况?
App.randomModule = angular.module('App.randomModule', ['ngRoute', 'ui.router'])
.config(function ($stateProvider){
$stateProvider
.state('general', {
url: '/general',
resolve: {
redirect: function ($state){
// Working
window.setTimeout(function(){
$state.go('boards');
}, 0); // Note there's no delay
// Not working
$state.go('boards');
}
}
})
});
答案 0 :(得分:4)
setTimeout(function(){}, 0)
在下一个tick中执行该功能。并且你的决心:除非你做其他事情,否则不会调用重定向。
因此,当你处于当前循环中时,你告诉ui-router:$go('/general')
- 所以现在它需要转向一般。但它不会立即这样做,因为它有一个resolve()
!首先,它尝试解析redirect
对象,然后执行“$go('/general');
因此,您可以为摘要周期进行一些更改: - 创建解析对象(也许你在那里返回一个promise,也许是一个值,可能是未定义的,无所谓) - $ state.go('/ board') - $ state.go('/ general')
并且(假设在这里),angular会看到它在diggest周期中发生变化,它会看到即使你调用了解析,它也不是最后一个要放置的URL而是被覆盖了。
然而,当您将setTimeout()
置于播放状态时,您的go('board')在摘要循环之后被称为,因此将执行。
另一方面,你最好使用$ timeout而不是setTimeout。
答案 1 :(得分:2)
为什么要尝试使用resolve
?只需注入$urlRouterProvider
并设置重定向规则:
$urlRouterProvider.when('/general', '/boards');
答案 2 :(得分:0)
使用ui-router事件会更好。有$ stateChangeStart来帮助你。
$rootScope.$on('$stateChangeStart',
function(event, toState, toParams, fromState, fromParams){
// your logic
if (...) {
event.preventDefault();
}
})
链接:https://github.com/angular-ui/ui-router/wiki#state-change-events