2014-11-14 88 views
5

我有一個應用程序應該基於一些API數據服務於不同的狀態。如果我的應用程序的狀態配置是這樣的:如何動態更改ui-router使用的默認狀態?

$stateProvider.state('order', { 
    url: '/order/{serviceId}', 
    controller: 'OrderController', 
    abstract: true, 
    resolve: { 
     OrderResolve: function(Order, $stateParams){ 
      return Order.fetch($stateParams.serviceId); 
     } 
    } 

}).state('order.sharepoint', { 
    url: '/sharepoint', 
    abstract: true, 
    controller: 'SharePointController' 

}).state('order.sharepoint.index', { 
    url:'', 
    controller: 'SharePointServiceController' 

}).state('order.sharepoint.setup', { 
    url:'', 
    controller: 'SharePointSetupController' 

}).state('order.sharepoint.confirm', { 
    url:'', 
    controller: 'SharePointConfirmController' 
}); 

然後我想1 2的狀態被默認爲關閉基於在OrderResolve對象的值。基本上,我使用resolve來獲取API數據,告訴我該用戶是否激活SharePoint服務。如果OrderResolve.hasSharepoint == true那麼我想默認爲order.sharepoint.index狀態,但是如果OrderResolve.hasSharepoint == false那麼我想默認爲order.sharepoint.setup狀態。第一個狀態顯示SharePoint數據,第二個狀態只是「設置」Sharepoint服務的一種形式。

是否有一種簡單的方法來實現這種類型的功能?

+0

默認情況下,UI路由器似乎選擇在$ stateProvider在這種情況下是第一狀態'order.sharepoint.index' ..因此,我可以讓它每次加載'index',然後只要從'index'控制器重新指向'setup'狀態(如果需要的話)。這只是感覺hacky – 2014-11-14 21:27:42

+0

Did你設法使它工作?我在這裏遇到同樣的問題,如果你找到答案,很高興發佈答案 – gfpacheco 2016-06-21 22:06:54

回答

0

你需要一箇中間狀態,你已經擁有了它。如果您從order.sharepoint中刪除abstract: true,並始終轉到該狀態,無論您的OrderResolve解析值如何。

然後,在SharePointController你可以訪問OrderResolve,你可以決定你的目標狀態:

// inside SharePointController 

if (OrderResolve.hasSharepoint == true){ 
    $state.go('order.sharepoint.index'); 
else { 
    $state.go('order.sharepoint.setup'); 
}