为什么我的$ state.go仅在setTimeout内部工作?

时间:2014-11-18 20:24:05

标签: javascript angularjs angular-ui-router

我需要在用户/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');
        }
      }
    })
  });

3 个答案:

答案 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