Можно ли использовать обещания прямо в свойстве разрешения маршрутизатора? Я хочу использовать сервис, чтобы проверить, имеет ли пользователь разрешение на доступ к странице в решении маршрута. Пример:Разрешить обещание по маршруту разрешить свойство
$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, а данные еще нет, когда маршрут разрешен.
Здравствуйте, vodich, проблема в решении, вам нужно это, чтобы вернуть обещание, на данный момент ваше свойство безопасности ничего не возвращает. Таким образом, либо добавьте $ q в функцию безопасности, и верните defer.promise, как только вы выполнили всю свою логику или измените функцию checkUserAndRole, чтобы обрабатывать изменение состояния. – George
Хорошо, но я не хочу передавать какие-либо данные контроллеру, просто нужно чтобы сделать это в решении, и вот оно. – vodich