В настоящее время я использую $rootScope
для хранения информации о пользователе и независимо от того, вошел ли пользователь в систему. Я пробовал использовать $window.localStorage
, но безуспешно. Моя цель состоит в том, чтобы элементы в моем навигаторе появлялись через ng-show после входа пользователя в систему, отображали свое имя пользователя на панели навигации, в виде отдельного профиля пользователя, просмотра всех пользователей и т. Д. Мне нужен постоянный логин. У меня есть navbar, работающий с $rootscope
, но всякий раз, когда я пытаюсь перейти на $window.localStorage
, он терпит неудачу. Вот код, с помощью $rootScope
:Использование локального хранилища для хранения данных AngularJS
mainModule
angular.module('mainModule', [
'ui.router',
...
])
.config(configFunction)
.run(['$rootScope', '$state', 'Auth', function($rootScope, $state, Auth) {
$rootScope.$on('$stateChangeStart', function(event, next) {
if (next.requireAuth && !Auth.getAuthStatus()) {
console.log('DENY');
event.preventDefault();
$state.go('login');
} else if (Auth.getAuthStatus() || !Auth.getAuthStatus()) {
console.log('ALLOW');
}
});
}]);
Auth завод
angular.module('authModule').factory('Auth', ['$http', '$state', function authFactory($http, $state) {
var factory = {};
var loggedIn = false;
var userData = {};
factory.getAuthStatus = function() {
$http.get('/api/v1/auth')
.success(function(data) {
if (data.status == true) {
loggedIn = true;
} else {
loggedIn = false;
}
})
.error(function(error) {
console.log(error);
loggedIn = false;
});
return loggedIn;
}
return factory;
}]);
Войти Контроллер
function SigninController($scope, $rootScope, $http, $state) {
$scope.userData = {};
$scope.loginUser = function() {
$http.post('api/v1/login', $scope.userData)
.success((data) => {
$scope.userData = data.data;
$rootScope.loggedIn = true;
$rootScope.userData = data;
$state.go('home');
})
.error((error) => {
console.log('Error: ' + error);
});
};
}
Nav контроллер
function NavbarController($scope, Auth) {
$scope.loggedIn = Auth.getAuthStatus();
}
EDIT EDIT EDIT
Вот как я использую локальное хранилище. Это единственное, что изменилось.
Войти Контроллер
function SigninController($scope, $window, $http, $state) {
$scope.userData = {};
$scope.loginUser = function() {
$http.post('api/v1/login', $scope.userData)
.success((data) => {
$scope.userData = data.data;
$window.localStorage.setItem('userData', angular.toJson(data));
$window.localStorage.setItem('loggedIn', true);
$state.go('home');
})
.error((error) => {
console.log('Error: ' + error);
});
};
}
Auth завод
angular
.module('authModule')
.factory('Auth', ['$http', '$window', '$state', function authFactory($http, $window, $state) {
var factory = {};
factory.getAuthStatus = function() {
$http.get('/api/v1/auth')
.success(function(data) {
if (data.status == true) {
$window.localStorage.setItem('loggedIn', true);
} else {
$window.localStorage.setItem('loggedIn', false);
}
})
.error(function(error) {
console.log(error);
$window.localStorage.setItem('loggedIn', false);
});
return $window.localStorage.getItem('loggedIn');
}
return factory;
}]);
Не могли бы вы показать свою попытку, которая не работает? Кроме того, используйте localStorage, а не $ window.localStorage. Кроме того, localStorage хранит только строки, поэтому вы захотите использовать JSON.stringify() и JSON.parse() для хранения/извлечения ваших объектов в localStorage – holtc
@holtc Да, дайте мне несколько минут! Спасибо! – 2b2a
@holtc It up up! Не могли бы вы объяснить, почему бы не использовать $ window.localStorage? Мой пример использует это, потому что это то, что я использовал раньше. – 2b2a