2014-11-14 6 views
5

Mam aplikację, która powinna obsługiwać różne stany na podstawie niektórych danych API. Jeśli stan mojego app konfiguracja wygląda tak:Jak dynamicznie zmieniać domyślny stan używany przez 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' 
}); 

Następnie chcę 1 2 stany mają być domyślnie wyłączone na podstawie wartości w obiekcie OrderResolve. Zasadniczo używam resolve, aby pobrać dane API, które informują mnie, czy ten użytkownik ma aktywowaną usługę SharePoint. Jeśli OrderResolve.hasSharepoint == true, a następnie chcę domyślnie stan order.sharepoint.index, ale jeśli OrderResolve.hasSharepoint == false, a następnie chcę, aby domyślnie stan order.sharepoint.setup. Pierwszy stan pokazuje dane SharePoint, a drugi stan to tylko forma do "ustawienia" usług SharePoint.

Czy istnieje prosty sposób osiągnięcia tego typu funkcji?

+0

Domyślnie ui-Router wydaje się wybrać pierwszy stan w $ stateProvider która w tym przypadku jest 'order.sharepoint.index' .. więc mógłbym pozwolić mu ładować' index' za każdym razem, a następnie po prostu przekierować ponownie do 'setup' z kontrolera' index' jeśli to konieczne .. to po prostu wydaje się być hacky –

+0

udaje ci się to zrobić? Mam ten sam problem, byłoby miło opublikować odpowiedź, jeśli ją znalazłeś – gfpacheco

Odpowiedz

0

Potrzebujesz średniego stanu i już go masz. Jeśli usuniesz abstract: true, z order.sharepoint i zawsze przechodzisz do tego stanu bez względu na wartość rozstrzygnięcia .

Następnie w SharePointController masz dostęp do OrderResolve i można postanowił swój stan docelowy:

// inside SharePointController 

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