2014-10-16 92 views
0

我正在使用Angular UI路由器模块导航到嵌套状态。当路由到一个嵌套的UI路由器状态时,如何检查父节点将调用哪个嵌套状态?

我有一个叫做program的状态,以及一个叫做program.dashboard的状态。

每当用户路由到program(不提供嵌套路由),它应该重定向到program.dashboard。我怎么能从状态内知道它是否在通往嵌套路线?

我现在遇到的问题是,路由到program下的任何嵌套路由导致重定向到program.dashboard,因为当程序路由被评估时,它不知道仍然要加载的子路由。

这里的回答详细说明了我遇到的问题。他们指出,除了program.dashboard之外,您将永远无法导航到program之下的任何状态,这正是我要检查它发生的地方并有条件地重定向的原因。 Angular JS ui-router how to redirect to a child state from a parent?

任何帮助,将不胜感激。

.state('program', { 
      url: "/program/{programId:[0-9]{1,8}}", 
      templateUrl: "components-child", 
      controller: function($scope, $rootScope, orgService, $state, 
      $stateParams) { 
       var vm = this; 
       vm.curentOrganization = null; 
       vm.currentProgram = null; 

       $scope.$watch(function() { 
         return orgService.currentProgram(); 
        }, 
        function(newVal, oldVal) { 
         if (newVal != null) { 
          //this causes a redirect to program.dashboard 
          //even if I want to go to..say.. program.settings 
          $state.go('program.dashboard', 
           { programId: newVal.programId }); 

          vm.currentProgram = newVal; 
         } 
        }, true); 

      }, 
      params: { programId: { value: '{{currentProgram.programId}}' } }, 
     }) 
.state('program.dashboard', { 
      url: "/dashboard", 
      templateUrl: "dashboard-dashboard", 
      controller: 'DashboardController as vm', 
     }) 

回答

0

如果我正确理解您的意图,您可能想要听$ stateChangeStart,而不是观看服务值。

app.run(function($state, $rootScope) { 
    $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) { 
    if (toState.name === 'program') { 
     // this is a transition directly to 'program' 
     event.preventDefault(); // cancel the transition 
     $state.go('program.dashboard', toParams); // push them to 'program.dashboard' 
    } 
    }); 
});