#angularjs #location
#angularjs ( ангулярджс ) #Расположение #angularjs
Вопрос:
Я работаю над аутентификацией с помощью angularjs, поэтому после подключения моего пользователя я хочу перенаправить его на домашнюю страницу:
$scope.submit = function(user) {
var request = {
method: 'POST',
url: 'http://localhost:9001/signIn',
headers: {
'Content-Type': 'application/json'
},
data: {
"email": user.email,
"password": user.password,
"rememberMe": true
}
};
$http(request).then(function(data) {
$location.path('/home');
}, function(error) {
console.log(error);
});
};
вот моя конфигурация:
app.config(function($urlRouterProvider, $stateProvider, $httpProvider, $authProvider) {
$urlRouterProvider.otherwise('/home');
$stateProvider
.state('home', {
url: '/home',
templateUrl: '/home',
controller: 'HomeCtrl',
resolve: {
authenticated: function($q, $location, $auth) {
var deferred = $q.defer();
if (!$auth.isAuthenticated()) {
$location.path('/signIn');
} else {
deferred.resolve();
}
return deferred.promise;
}
}
})
.state('signIn', {
url: '/signIn',
templateUrl: '/signIn',
controller: 'SignInCtrl'
});
});
Я пробовал это:
$http(request).then(function(data) {
$scope.$evalAsync(function() {
$location.path('/home');
});
console.log(data);
}, function(error) {
console.log(error);
});
также :
$location.path('/home');
$location.replace();
Ни одно из вышеперечисленных действий не работает, любая помощь приветствуется.
Комментарии:
1.
$http
Запрос определенно выполнен успешно? Вы внедряете$location
в контроллер? Это не продемонстрировано в вашем вопросе.2. да! Я думаю, что у меня проблема с разрешениями: / спасибо за ваш ответ
3. Что за ошибку вы получаете?
Ответ №1:
home
Функция определения состояния не может разрешить или отклонить $q.defer
обещание, когда $auth.isAuthenticated()
возвращает false. Это приведет к зависанию promise и создаст утечку памяти.
//ERRONEOUS CODE
$stateProvider
.state('home', {
url: '/home',
templateUrl: '/home',
controller: 'HomeCtrl',
resolve: {
authenticated: function($q, $location, $auth) {
var deferred = $q.defer();
if (!$auth.isAuthenticated()) {
$location.path('/signIn');
//FAILS to resolve or reject promise
} else {
deferred.resolve();
}
return deferred.promise;
}
}
})
Вместо этого возвращает отклонение при отсутствии аутентификации:
$stateProvider
.state('home', {
url: '/home',
templateUrl: '/home',
controller: 'HomeCtrl',
resolve: {
authenticated: function($q, $location, $auth) {
//var deferred = $q.defer();
if ($auth.isAuthenticated()) {
return $q.resolve("AUTHENTICATED");
};
//otherwise
return $q.reject("NOT AUTHENTICATED");
})
}
})
Когда функция распознавания возвращает отклоненное обещание, изменение состояния будет предотвращено и $stateChangeError
событие будет транслироваться дальше $rootScope
.