2016-04-14 8 views
1

Gibt es eine Möglichkeit, einen Benutzer in einen bestimmten Zustand umleiten, basierend auf Daten von Cookies bei der Verwendung von ui-router?

Ich habe versucht, es von der .config() zu tun, aber da ich nicht in der Lage bin, andere Abhängigkeiten zu injizieren, hat es nicht funktioniert.

Ich habe auch versucht, es auf dem .run() Block zu tun, aber es gibt nur eine Schleife (natürlich).

Dies ist, was ich versucht, zuerst auf dem Gibt es .config()

function ConfigRouter($locationProvider, $stateProvider, $urlRouterProvider, Constant, localStorageService) { 
    $locationProvider.html5Mode(true); 

    $urlRouterProvider.when('/', function($injector) { 
     var $state = $injector.get('$state'); 
     checkState($state); 
    }); 
    $urlRouterProvider.when('', function($injector) { 
     var $state = $injector.get('$state'); 
     checkState($state); 
    }); 
    $urlRouterProvider.otherwise(function($injector) { 
     var $state = $injector.get('$state'); 
     $state.go('error'); 
    }); 

    function checkState($state) { 
     var userCookie = localStorageService.cookie.get(Constant.cookieName); 
     if(userCookie.type == 1) { 
      $state.go('home-app'); 
     } else if (userCookie.type == 2) { 
      $state.go('home-client'); 
     } //and so on 
    } 

} 

einen Weg, es zu tun? Oder anderen Weg, um das gleiche Ergebnis zu erzielen? Grundsätzlich muss ich den Benutzer basierend auf der Benutzerrolle zu einem anderen Teil der App senden. Wenn er ein Admin, Client, Moderator, etc .. Jeder hat eine spezifische App und muss bestimmte Daten vom Server abrufen, deshalb möchte ich es tun, so kann ich die Daten über die Auflösung von jedem Staat anfordern.

Antwort

1

Wenn Sie Winkel ui-Router verwenden, können Sie resolve auf dem oberen Zustand verwenden, dort können Sie Dienste injizieren, die Sie das Cookie

Sie es auch abfangen zu überprüfen hilft und kann tun, während

.run(["$rootScope", "$location", "$state", "services.userService", function ($rootScope, $location, $state) { 
     $rootScope.$on('$stateChangeStart', function (e, toState, toParams 
      , fromState, fromParams) { 
// validation 
}); 

weitere Informationen https://github.com/angular-ui/ui-router/wiki#resolve

und hier Beispiele angular ui-router login authentication

Defer Angular UI Router $stateChangeStart until server authorization response receieved

ej:

.state('main', { 
        templateUrl: 'app/modules/home/view.html', 
        abstract: true, 
        resolve: { 
         authorize: ['userService', "$state", "$q", 
          function (userService, $state, $q) { 
           return checkAuthorization(userService, $state, $q) 
            .then(function (user) { 
             return {user: user} 
            }); 
          }] 
        }, 
        controller: 'RootController' 
       }) 
// more states 

var checkAuthorization = function(userService, $state){ 
    //do all the necessary checks and return the user if he is already logged in 
//redirecct to other page if the check failed 
} 
0

Ich habe Benutzerprüfung im .run Abschnitt:

.run(['$rootScope', '$state', '$cookies', 
    function ($rootScope, $state, $cookies) { 
     if ($cookies.get('token')) 
      $state.go('main'); 
     else 
      $state.go('guest) 
    }]); 

Natürlich, als Sie sollten 'token' in Cookie installieren. Und jetzt brauchen Sie $ urlRouterProvider nicht in .config

Verwandte Themen