2016-08-05 3 views
0

Можно ли использовать обещания прямо в свойстве разрешения маршрутизатора? Я хочу использовать сервис, чтобы проверить, имеет ли пользователь разрешение на доступ к странице в решении маршрута. Пример:Разрешить обещание по маршруту разрешить свойство

  $stateProvider 
      .state('user', { 
       url: '/user', 
       templateUrl: 'app/views/user/views/user.html', 
       controller: 'UserCtrl', 
       controllerAs: 'vm', 
       resolve: { 
        security: ['$state', 'userService','messageService','$location', function ($state, userService, messageService, $location) { 
         userService.checkUserAndRole("user").then(function(data){ 
         var data = userService.checkUserAndRole("user"); 
         if (data.access === false) { 
          messageService.errorMsg(data.message); 
          var route = data.route ? data.route:$location.path(); 
          $state.go(route); 
         }); 
        }] 
       } 
      }); 

Я использую $ Q службу в UserService вернуть обещание

function checkUserAndRole(page){ 
     var defer = $q.defer(); 
     var response = {}; 
     if(!ROLE[page]){ 
      response.access = false; 
      response.message = "Page is not defined in ROLE config. Please tell admin to correct this!"; 
      response.route = "login"; 
      defer.resolve(response); 
     } 

     if(!user.roles){ 
      response.access = false; 
      response.message = "Logged in user does not seem to have any role data defined. That is why you are redirected"; 
      response.route = "/"; 
      defer.resolve(response); 
     } 

     if(!helperService.arrayIntersect(ROLE[page],user.roles)){ 
      response.access = false; 
      response.message = "You don't have a permission to access '/"+page+"' url"; 
      defer.resolve(response); 
     } 

     response.access = true; 
     response.message = ""; 
     response.route = ""; 

     return defer.promise; 
    } 

Если я не использую, но обещания вернуть данные из службы сразу все работает хорошо, но при обновлении Я по-прежнему получаю недопустимые результаты, так как данные пользователя из службы извлекаются через $ http, а данные еще нет, когда маршрут разрешен.

+0

Здравствуйте, vodich, проблема в решении, вам нужно это, чтобы вернуть обещание, на данный момент ваше свойство безопасности ничего не возвращает. Таким образом, либо добавьте $ q в функцию безопасности, и верните defer.promise, как только вы выполнили всю свою логику или измените функцию checkUserAndRole, чтобы обрабатывать изменение состояния. – George

+0

Хорошо, но я не хочу передавать какие-либо данные контроллеру, просто нужно чтобы сделать это в решении, и вот оно. – vodich

ответ

1

Устранение функций работает с обещаниями, но важно return обещание функции распознавателя.

$stateProvider 
    .state('user', { 
     url: '/user', 
     templateUrl: 'app/views/user/views/user.html', 
     controller: 'UserCtrl', 
     controllerAs: 'vm', 
     resolve: { 
      security: ['$state', 'userService','messageService','$location', function ($state, userService, messageService, $location) { 
       //RETURN the promise 
       return (
        userService.checkUserAndRole("user") 
         .then(function(data){ 
          if (data.access === false) { 
           messageService.errorMsg(data.message); 
           var route = data.route ? data.route:$location.path(); 
           $state.go(route); 
         }); 
       ); 
      }] 

     } 
    }); 

Отказываясь возвращения обещание функции распознавателя, маршрутизатор решает security к null, не дожидаясь обещанного завершения.


Также функция checkUserAndRole не решает $q.defer в том случае, если ни один из if условий не являются истинными. Код необходимо переписать.

function checkUserAndRole(page){ 
    var response = {}; 
    var promise = $q.when(); 
    if(!ROLE[page]){ 
     response.access = false; 
     response.message = "Page is not defined in ROLE config. Please tell admin to correct this!"; 
     response.route = "login"; 
     promise = $q.when(response); 
    } else if(!user.roles) { 
     response.access = false; 
     response.message = "Logged in user does not seem to have any role data defined. That is why you are redirected"; 
     response.route = "/"; 
     promise = $q.when(response); 
    } else if(!helperService.arrayIntersect(ROLE[page],user.roles)){ 
     response.access = false; 
     response.message = "You don't have a permission to access '/"+page+"' url"; 
     promise = $q.when(response); 
    } else { 
     response.access = true; 
     response.message = ""; 
     response.route = ""; 
     promise = $q.when(response); 
    }; 

    return promise; 
} 

Избегайте $q.defer, как он склонен к ошибкам кодирования. Вместо этого используйте $q.when, чтобы создать обещание от значения.

+0

Отлично, узнал что-то сегодня, спасибо! – vodich

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