каждый раз, когда изменяется маршрут, я проверяю, установлена ли переменная с текущими зарегистрированными данными пользователя, если эта переменная не установлена, я просто перенаправляюсь на страницу входа.Отложить создание контроллеров/служб при запуске приложения angularjs
Теперь я пытаюсь достичь какой-то функциональности «помнить меня», поэтому каждый раз, когда маршрут изменяется, если пользователь переменной не существует, а не перенаправляется на страницу входа в систему, я проверяю локальное хранилище на «authtoken», если установлено, я вызываю функцию проверки, передающую authtoken на сервер, которая возвращает пользователя, и приложение будет работать так же, как после входа в систему (который возвращает того же пользователя, что и функция проверки).
Я уверен, что это не лучший способ сделать это.
Если я перезагружаю страницу, первое, что я запускаю функцию проверки, которая отправляет authtoken на сервер и ждет ответа, если пользователь существует, это значение присваивается переменной в корневом каталоге.
У меня есть различные услуги, которые используют переменную в rootscope, например
angular.module('myApp')
.service('AdminService', function AdminService($rootScope, $http, StorageService) {
var authtoken = StorageService.get('authtoken');
var clientId = $rootScope.loggedUser.id;
и, конечно же, когда функция проверки работает он ожидает ответа, но служба в настоящее время экземпляр и $ rootScope.loggedUser .id не существует.
Как я могу сказать приложению подождать, пока функция проверки получит ответ?
Это мой код
....
}).run(function($rootScope, $location, AuthService, StorageService) {
var intended = $location.path();
AuthService.check().success(function(data) {
if(data.user) {
$rootScope.loggedUser = data.user;
$location.path(intended);
} else $location.path('login');
});
$rootScope.$on('$routeChangeStart', function() {
if($rootScope.loggedUser) {
....
Например, если пользователь закладка страницы «myapp.com/#/admin/users», я не хочу, чтобы перенаправить на вход в систему, если у меня есть в локальное хранилище authtoken, но это приводит к созданию экземпляра контроллера, который использует службу, которая нуждается в $ rootScope.loggedUser.id, который еще не заселен.
И я хочу запустить проверку функции только при загрузке страницы (не каждый раз, когда пользователь меняет маршрут).
Посмотрите на '$ routeProvider 'и свойство' resolve' маршрута. –
В этом случае он должен разрешать каждый раз, когда пользователь посещает этот маршрут? Поскольку я хочу одноразовую проверку, когда пользователь загружает приложение, мне не нужно проверять каждый раз, когда пользователь посещает маршрут. – peppeocchi
Тогда вы могли бы использовать метод '.run', но с проверкой подлинности я предлагаю использовать решение, потому что аутентификация может истечь и т. д. Вам не нужно каждый раз вызывать вызов сервера, просто изучите токен аутентификации для истечения срока действия –