2015-07-27 2 views
0

Я использую angular-acl (https://github.com/mikemclin/angular-acl) для управления логикой авторизации моего приложения и работает нормально, за исключением случаев, когда пользователь открывает новое окно/вкладку.Как загрузить данные сеанса перед изменением состояния StateProvider в AngularJs?

Когда пользователь открывает новое окно/вкладку, я не могу получить доступ к sessionStorage, поэтому мне нужно перезагрузить acl и роли пользователя из API, но по мере того как запрос является асинхронным, он обычно решает после проверки разрешения.

Как я могу подтвердить, что stateProvider только изменит страницу после загрузки списка acl?

Вот как я пытаюсь перезагрузить разрешение:

myApp.run(['AclService', 'Auth', '$http', function (AclService, Auth, $http) { 
    if(!AclService.resume()) { 
     Auth.load_acl(); 
     Auth.load_user_roles(); 
     // I need to certify that these requests are complete before continue 
    } 
}]); 

Служба, сделать запрос:

var authServices = angular.module('authServices', []); 

authServices.factory('Auth', ['$http', 'AclService', function($http, AclService) { 
    var authService = {}; 

    authService.load_acl = function() { 
     return $http.get('/auth/get_acl').then(function(response){ 
      var aclData = {}; 
      for(i in response.data) { 
       var role = response.data[i]; 
       if(aclData[role.name] === undefined) 
        aclData[role.name] = []; 
       aclData[role.name].push(role.ability_name); 
      } 
      AclService.setAbilities(aclData); 
     }); 
    }; 

    authService.load_user_roles = function() { 
     return $http.get('/auth/get_user_roles').then(function(response){ 
      for(role in response.data) { 
       AclService.attachRole(response.data[role]); 
      } 
     }); 
    }; 

    return authService; 
}]) 

ответ

0

Используйте состояние/маршрут распознавателя:

... 
resolve: { 
    auth: function (AclService, Auth, $q) { 
    if(!AclService.resume()) { 
     return $q.all([Auth.load_acl(), Auth.load_user_roles()); 
    } 
    } 
} 

Оберните его в отдельную службу, если вам нужно его повторно использовать.

Смежные вопросы