2016-06-01 2 views
3

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

Сначала он сохраняет в контроллере пользовательскую переменную, это часть действия входа в систему.

$window.sessionStorage.setItem('user', AuthenticationService.getUser()); 

Затем я хочу показать некоторые HTML-теги в зависимости от роли этого пользователя, с чем-то вроде следующего:

<li><a id="id" ng-if="user.role=='admin'" href> console </a></li> 

У меня было что-то похожее на это, используя $ rootScope, но когда я обновляю страницу, я теряю значение. Вот почему мне нужно использовать window.sessionStorage

Есть ли способ доступа в html сохраненного значения в sessionStorage? или это неправильно, и мне нужен другой подход?

+0

Скопируйте значение в объект области видимости в 'нг-load' вашего контроллера или в корпусе контроллера. – dman2306

+0

Я бы написал «Провайдер» в вашей позиции, провайдер будет запускаться до запуска приложения, передавая ему соответствующую информацию об аутентификации, исходя из того, что вы можете определить погоду или нет, вы увидите некоторые теги. –

+0

@ dman2306 Если я обновляю страницу, могу ли я потерять значение, которое является хранилищем в этой переменной области видимости? –

ответ

0

$ window - это просто оболочка вокруг окна, поэтому этот подход будет работать, но предпочтительнее использовать некоторые другие средства, такие как файлы cookie, чем загрязнять окно $.

Вы должны использовать функцию контроллера или даже лучшую глобальную службу пользователей для доступа к пользователю.

Там довольно подробная статья о том, как сделать это здесь: http://www.nesterovsky-bros.com/weblog/2015/01/26/windowsessionStorageInAngularJS.aspx

Если у вас есть несколько пользовательских свойств, используйте toJson и fromJson для хранения объекта в памяти сеанса, такие как:

var user = { name:'mike', role: 'admin'} 
$window.sessionStorage.setItem('user',angular.toJson(user)); 

и :

var user = angular.fromJson($window.sessionStorage.getItem('user')) 

Если вам необходимо получить доступ к пользователю из нескольких разных мест, сервис как @Deblaton Рек исправлено - это путь, но, предполагая, что у вас есть несколько свойств для вашего пользователя, добавьте угловые. json и angular.fromJson линии, как у меня выше.

, как вы обращаетесь к пользователю в вашем HTML требует, чтобы он присутствовал на текущей области, так что если вы используете сервисный подход в контроллере вы бы добавить:

$scope.user = UserService.getUser(); 
+0

Но что мне нужно положить в html? –

+0

Почему downvotes здесь и в вопросе? –

+0

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

2

Вы можете сделать это с помощью сервиса/завод

angular.module('myApp').factory("PrincipalService", [ 
    "$window", 
    function($window){ 

     var user; 

     return { 
      getUser : getUser, 
      setUser: setUser 
     }; 

     function getUser(){ 
      return user || angular.fromJson($window.sessionStorage.getItem('user')); 
     } 

     function setUser(userInfo){ 
      user = userInfo; 
      $window.sessionStorage.setItem('user', angular.toJson(userInfo)); 
     } 

    } 
]); 

редактировать

То, как я мог бы использовать его, чтобы поделиться через каждые взгляды через корень Область применения:

angular.module("myApp").run(["$rootScope", "PrincipalService", 
    function($rootScope, PrincipalService){ 
     $rootScope.getUser = PrincipalService.getUser; 
     $rootScope.setUser = PrincipalService.setUser; 
    } 
]); 

А потом, в ваших взглядах вы можете позвонить:

<span>{{$root.getUser()}}</span> 
+0

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

+0

Я не могу использовать это решение, потому что пользовательская информация загружается после входа в систему, и перед этим выполняются методы запуска. Но я даю вам +1, потому что с частью вашего решения я реализую что-то, что работает –

+1

@IkerAguayo. Мой сервис возвращает методы получения и настройки информации о пользователе. Это не должно быть строго связано с процессом аутентификации. Ваша аутентификация может использовать службу, которую я опубликовал, чтобы хранить информацию о пользователе, но вы не хотите менять свое приложение в тот день, когда ваш процесс аутентификации изменится. –