2014-09-19 3 views
0

У меня есть следующие угловые услуги:Угловая службы вызывается дважды

appServices.factory('AuthenticationService', function() { 
    var auth = { 
     isLogged: false 
    } 

    return auth; 
}) 

и это TokenInterceptor сервис:

appServices.factory('TokenInterceptor', function ($q, $window, AuthenticationService) { 
    return { 
     request: function (config) { 
      config.headers = config.headers || {}; 
      if ($window.sessionStorage.token) { 
       config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token; 
      } 
      return config; 
     }, 

     response: function (response) { 
      console.log(AuthenticationService.isLogged) 
      return response || $q.when(response); 
     } 
    }; 
}); 

который я нажимаю в $httpProvider

$httpProvider.interceptors.push('TokenInterceptor'); 

И

$routeProvider. 
     when('/', { 
      templateUrl: 'partials/index', 
      controller: IndexCtrl, 
      access: { requiredLogin: true } 
     }) 

После входа в AuthenticationService.isLogged = true, и если я перемещаться по маршруту «/» через agular кнопки все нормально, но когда страница обновляется AuthenticationService инстанциируется снова, и я могу видеть, что console.log(AuthenticationService.isLogged) отпечатки false и inmediately после отпечатков true так страница переходит к «/ login».

Почему печать ложных -> правда? Что я могу сделать, чтобы сохранить состояние аутентификации после обновления?

EDIT:

Спасибо за все ваши ответы. В комментариях к аутентификации tutorial Я следил за кем-то, упомянувшим ту же проблему. Я понял, что их подход был немного громоздким. AuthenticationService не намного больше, чем проверка наличия токена в $window.sessionStorage.token, так что вы были в порядке с использованием своего рода хранилища.

Я в конечном итоге просто делает:

appServices.factory('AuthenticationService', function() { 
    isLogged: function() { 
     return $window.sessionStorage.token == true 
    }  
}) 
+1

Возможно, вы захотите взглянуть на ngStorage или на какой-то механизм хранения. – PSL

+0

@PSL Я не думаю, что в этом смысл. Я думал больше о том, как ждать второго isLoggein = true или пытаясь избежать isLoggein = false. – eskalera

+0

Извините mybad. Я правильно прочитал его – PSL

ответ

1

При загрузке страницы вы инициализируете ее до false.

var auth = { 
    isLogged: false 
}; 

Итак, когда вы установите его верно после входа в систему с

AuthenticationService.isLogged = true; 

Это нормально, пока вы не naviage прочь и ваш Javascript контекст теряется, и все начинается снова, в этот момент он еще раз ложный.

Вы уже используете sessionStorage, чтобы вы могли также придерживаться этого, т. Е.что-то вроде:

AuthenticationService.isLogged = true; 
$window.sessionStorage.isLogged = "yeah"; 

Затем замените инициализатору с

var auth = { 
    isLogged: $window.sessionStorage.isLogged == "yeah" ? true : false 
}; 

Это простой пример, я бы, вероятно, поставить setLoggedIn или что-то подобное на службу, который делает sessionStorage настройки, так что вы имейте это в одном месте.

1

Вы можете попробовать это:

function init($rootScope) { 
    $rootScope.$on('$routeChangeStart', function (event, next, current) { 

    } 
} 

И добавить .run (INIT) к вашей угловой декларации в нижней части вашего приложения:

angular 
    .module('app', ['ngRoute']) 
    .config(config) 
    .run(init) 

Он будет вызываться после каждого обновления навигатора. Вы можете хранить свои данные в $ window.sessionStorage и тестировать его после каждого обновления.

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