2015-05-27 66 views
1

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

我想在这种情况下坚持一定的条件是真的。这意味着如果x === 4例如,然后我想要状态B成为第一个加载。

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

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

+0

不会是'$ urlRouterProvider.otherwise(功能($ injecto r,$ location){...}'解决方案吗?关于[$ urlRouterProvider]的更多细节(http://angular-ui.github.io/ui-router/site/#/api/ui.router.router.$urlRouterProvider)。如果你还需要**。run()**阶段...推迟执行可能是解决方案http:// stackoverflow。com/questions/30455792/start-angular-js-route-segment-or-ui-router-after-all-translations-are-loaded –

+0

你不能在$ routeProvider中使用解析,然后重定向到正确的路由 – George

+0

@RadimKöhler我会检查并报告,谢谢。 –

回答

1

a working example

正如在评论中讨论,我们可以使用本机,内置的功能,与UI-路由器的到来。其中之一是$urlRouterProvider.deferIntercept(defer)

禁用(或启用)推迟位置变更拦截。

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

一步骤 - 停止执行

所以,我们可以在.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) 

}]); 

硒都等待一秒钟,然后我们就重新启用所有执行并重定向到“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: '/'}); 
+0

我试过这样,但条件是依赖于异步结果,所以它不工作。无论如何,它显示了这个视图。 –

+2

应该至少提到,'ngRoute'和'UI-Router'是不一样的... –

+0

@downvoter,小心解释你的downvote? – Zee