Angular - 动态选择开始状态

时间:2015-05-27 09:08:43

标签: javascript angularjs angular-ui-router

显然,我的应用程序会自动以默认状态(具有url:“/”)启动。我们称之为州A

我希望在某种情况下是真实的时候再坚持下去。这意味着,如果x === 4,那么我希望状态B成为第一个加载的状态。

我的问题是,当我检查该条件时,例如在app.run中,默认状态已经被加载并显示在视图中,然后才切换到状态B

有没有什么方法可以阻止状态加载并在我检查条件后启动它?

2 个答案:

答案 0 :(得分:1)

a working example

正如评论中所讨论的,我们可以使用UI-Router附带的本机内置功能。其中一个是$urlRouterProvider.deferIntercept(defer)

  

禁用(或启用)延迟位置更改拦截。

     

如果您希望自定义同步URL的行为(例如,如果您希望延迟转换但保留当前URL),请在配置时调用此方法。然后,在运行时,在配置自己的$urlRouter.listen()事件处理程序后调用$locationChangeSuccess

予。步骤 - 停止执行

因此,我们可以在 .config() 阶段

中定义状态
.config(['$stateProvider', '$urlRouterProvider','$locationProvider',
    function ($stateProvider, $urlRouterProvider,$locationProvider) {

        // States
        $stateProvider
          ...
          .state('parent', {
              ...
          })
          .state('parent.child', { 
              ...
          })
          ;

        ...
        // here we say STOP
        $urlRouterProvider.deferIntercept();
    }
])

II。步骤 - 初始化.run()中需要的内容 - 重新启用执行

这可能是一些天真的运行示例:

.run(['$urlRouter', '$timeout', '$state',
  function($urlRouter, $timeout, $state) {

    $timeout(function(){

      // here we turn all on again...
      $urlRouter.sync();
      $urlRouter.listen();

      // there could be some decision, driven by $http load
      // we just use some state as default target
      $state.go("parent.child");
    }, 1000)

}]);

Se等待一秒钟,然后我们重新启用所有执行并重定向到" parent.childd" ......但可以是任何其他的,基于在 .run() 阶段做出的决定

检查here

答案 1 :(得分:0)

使用 resolve 。如果您使用 ngRoute

$routeProvider
.when('/' ,{
    templateUrl: "templates/A.html",
    resolve:{
        "check":function($location){   
            if(x==4){ 
               $location.path('/B');
            }
        }
    }
})
.when('/B' ,{
    templateUrl: "templates/B.html"
})
.otherwise({redirectTo: '/'});