2016-02-18 132 views
0

有沒有更容易的方式重定向到login狀態,而不使用resolve: {}在每個國家?我的應用程序正在不斷增加,並且向各個州添加像loginRequiredskipIfLoggedIn這樣的解決方案正在混淆我的配置塊。如果有幫助,我使用Satellizer進行身份驗證。輕鬆地重定向到Angular登錄?

例模塊航線配置:

(function() { 

    'use strict'; 

    angular 
     .module('uberCoolModule') 
     .config(configRoutes); 

    configRoutes.$inject = ['$stateProvider']; 
    function configRoutes ($stateProvider) { 

     $stateProvider 

      .state('login', { 
       url   : '/login', 
       templateUrl : 'entrance/login/login.html', 
       data  : { pageTitle: 'Login' }, 
       resolve: { 
        skipIfLoggedIn: skipIfLoggedIn 
       } 
      }) 
      .state('logout', { 
       url   : '/logout', 
       controller : 'Logout' 
       resolve: { 
        loginRequired: loginRequired 
       } 
      }) 
      .state('members', { 
       url   : '/members', 
       controller : 'Home' 
       resolve: { 
        loginRequired: loginRequired 
       } 
      }); 

     function skipIfLoggedIn($q, $auth) { 
      var deferred = $q.defer(); 
      if ($auth.isAuthenticated()) { 
       deferred.reject(); 
      } else { 
       deferred.resolve(); 
      } 
      return deferred.promise; 
     } 

     function loginRequired($q, $location, $auth) { 
      var deferred = $q.defer(); 
      if ($auth.isAuthenticated()) { 
       deferred.resolve(); 
      } else { 
       $location.path('/login'); 
      } 
      return deferred.promise; 
     } 

    } 

})(); 
+0

可以綁定'$ rootScope一個孩子的狀態不能被訪問'到[$ stateChangeStart](http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$state)事件,然後檢查那裏的所有內容 –

回答

1

最簡單的方法是有一個包含授權決心父狀態以及做出需要登錄所有的州是父狀態的兒童。

如果它的任何解決的祖先狀態被拒絕

app.state('members', { 
    url: '/members', 
    controller: 'Home' 
    resolve: { 
     loginRequired: loginRequired 
    } 
    }).state('members.profile', { 
    url: '/profile', 
    }); 

在這個例子中去/members/profile會失敗,如果loginRequired被拒絕

+0

極好的一點。這個應用程序使用嵌套狀態與每個模塊的一個父狀態...六個模塊意味着只有六個'resolve'語句。我沒有使用抽象狀態的唯一地方是在入口模塊(登錄,註銷等)。我感覺好多了。 –