2016-06-01 5 views
3

私の場合はangularjsで作業していて、保存された値にのユーザーにアクセスして、表示するかどうかを選択します。

まず、いくつかのコントローラにユーザ変数を保存します。これはログインアクションの一部です。

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

その後、私は以下のようなもので、そのユーザーの役割に応じて、いくつかのHTMLタグを表示したい:

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

私はこの使用して$ rootScopeに似たものがあったが、ページをリフレッシュすると値が失われます。だから私は使用する必要があるwindow.sessionStorage

保存された値をsessionStorageに保存する方法はありますか?これは間違っていて、別のアプローチが必要ですか?

+0

は、コントローラの 'NG-load'中またはコントローラの体内のスコープオブジェクトに値をコピーします。 – dman2306

+0

天気を定義することができるかどうかに基づいて、タグを表示するかどうかに基づいて、プロバイダがあなたのポジションに「プロバイダ」を書いて、アプリケーションが実行される前に実行され、関連する認証情報を渡します。 –

+0

@ dman2306ページを更新すると、そのスコープ変数に格納されている値が失われますか? –

答えて

0

$ウィンドウはウィンドウの周りのラッパーです。このアプローチはうまくいきますが、クッキーなどの他の手段を使用する方が$ windowを汚染するよりも好ましい方法です。

ユーザーにアクセスするには、コントローラー機能以上のグローバルユーザーサービスを使用する必要があります。

ここでこれを行う方法についてかなり詳細な記事があります: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 RECOMあなたはあなたのユーザーに複数のプロパティがあると仮定して、上記のようにangular.toJsonと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私のサービスは、ユーザー情報を取得して設定するメソッドを返すだけです。あなたの認証プロセスに厳重に縛られるべきではありません。あなたの認証は私がユーザ情報を保存するために投稿したサービスを使用することができますが、認証プロセスを変更する必要がある日にあなたのアプリケーション全体を変更する必要はありません。 –

関連する問題