2015-05-27 68 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