2016-11-29 1 views
1

Я устанавливаю значение локального хранилища в службе AngularJS и пытаюсь получить значение в контроллере AngularJS. Но в контроллере, получая нулевое значение вместо значения, которое я установил в службе.Значение локального хранилища JavaScript от Service to Controller в AngularJS

Вот сервис, где я поставил значение локального хранения:

app.factory('accountService', ['$http', '$q', 'serviceBasePath', 'userService', '$window', function ($http, $q, serviceBasePath, userService, $window) { 
    var fac = {}; 
    fac.login = function (user) { 
     var obj = { 'username': user.username, 'password': user.password, 'grant_type': 'password' }; 
     Object.toparams = function ObjectsToParams(obj) { 
      var p = []; 
      for (var key in obj) { 
       p.push(key + '=' + encodeURIComponent(obj[key])); 
      } 
      return p.join('&'); 
     } 

     var defer = $q.defer(); 
     $http({ 
      method: 'post', 
      url: serviceBasePath + "/token", 
      data: Object.toparams(obj), 
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' } 
     }).then(function (response) { 
      userService.SetCurrentUser(response.data); 

      // The local storage value I have set 

      localStorage.setItem('IsAuthenticated', true); 
      localStorage.setItem('userName', response.username); 

      defer.resolve(response.data); 
     }, function (error) { 
      defer.reject(error.data); 
     }) 
     return defer.promise; 
    } 
    fac.logout = function() { 
     userService.CurrentUser = null; 
     userService.SetCurrentUser(userService.CurrentUser); 

    } 
    return fac; 
}]) 

Вот контроллер, где я пытаюсь получить ранее установленное локальное значение хранения:

app.controller('indexController', ['$scope', 'accountService', '$location', '$window', function ($scope, accountService, $location, $window) { 

    $scope.message = localStorage.getItem("IsAuthenticated"); 
    console.log($scope.message); 

    $scope.logout = function() { 
     accountService.logout(); 
     $location.path('/login'); 
    } 

}]) 

Проблема: я получаю значение null вместо значения, которое я установил в сервисе.

Любая помощь Пожалуйста!

+0

Пожалуйста, проверьте локальное хранилище с помощью хрома отладки инструмента. Это значение хранится в локальном хранилище или нет – cfprabhu

+0

[MCVE] (http://stackoverflow.com/help/mcve). Никто, кроме вас, не знает, что именно там происходит. Если это null, наиболее разумным объяснением является то, что значение не было установлено. – estus

+0

Если вы никогда не называете «логин» ... И почему, зачем перегружать объект? Вы используете перегрузку ТОЛЬКО ОДИН !!! – Nico

ответ

0

Сначала попробуйте получить это в самом заводе .. после того, как вы установите его ... если вы сможете туда добраться, то, несомненно, вы тоже получите контроллер. Поскольку локальное хранилище не имеет отношения к фабрике или контроллеру.

0

Постарайтесь, используйте $ window.

$window.localStorage.setItem('userName', response.username); 
+0

Нет разницы между $ window.localStorage.setItem() и localStorage.setItem(), поскольку я передаю функцию $ window через функцию. – TanvirArjel

1

Лучший способ иметь дело с хранением браузера с использованием углового является:

1) Создание службы, которая занимается LocalStorage, sessionStorage, печенье с обобщенными методами, которые подвергаются через службу.

2) Эта услуга будет использоваться специализированной службой диспетчера, эта служба также обрабатывает ключи, которые будут использоваться для хранения в хранилище.

3) Эта услуга будет раскрывать более конкретные методы, потребляемые контроллером.

например:

UserController:

userService.setUserSession(session) 

UserService:

var SESSION_KEY = 'userSession'; 
setUserSession() { 
    storageService.sessionStorageProvider.set(SESSION_KEY, session) 
} 

StorageService:

// here you need to create generic method using inheritance which will expose sessionStorage and loacalStorage and cookieStorage. 
+0

Это лучшее и очень «ангар-образное» решение, просто сделайте для него сервис. Это следует отметить как решение – Pirozek

0

Я считаю, что вам нужно, чтобы ввести зависимость в свой завод:

app.factory('accountService', ['$http', '$q', 'serviceBasePath', 'userService', '$window', '$localStorage', function ($http, $q, serviceBasePath, userService, $window, $localStorage) { 
    var fac = {}; 
    fac.login = function (user) { 
     var obj = { 'username': user.username, 'password': user.password, 'grant_type': 'password' }; 
     Object.toparams = function ObjectsToParams(obj) { 
      var p = []; 
      for (var key in obj) { 
       p.push(key + '=' + encodeURIComponent(obj[key])); 
      } 
      return p.join('&'); 
     } 

     var defer = $q.defer(); 
     $http({ 
      method: 'post', 
      url: serviceBasePath + "/token", 
      data: Object.toparams(obj), 
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' } 
     }).then(function (response) { 
      userService.SetCurrentUser(response.data); 

      // The local storage value I have set 

      $localStorage.IsAuthenticated = true; 
      $localStorage.userName = response.username; 

      //localStorage.setItem('IsAuthenticated', true); 
      //localStorage.setItem('userName', response.username); 

      defer.resolve(response.data); 
     }, function (error) { 
      defer.reject(error.data); 
     }) 
     return defer.promise; 
    } 
    fac.logout = function() { 
     userService.CurrentUser = null; 
     userService.SetCurrentUser(userService.CurrentUser); 

    } 
    return fac; 
}]) 
Смежные вопросы