2013-01-08 9 views
89

私はユーザーにログインするAuthServiceを持っており、ユーザーjsonオブジェクトを返します。私がしたいのは、そのオブジェクトを設定し、ページを更新することなくアプリケーション全体に反映されたすべての変更(ログイン/ログアウト状態)です。現在のユーザーコンテキストをAngularに保存するにはどうすればよいですか?

どのようにAngularJSでこれを達成できますか?

答えて

177

これを達成する最も簡単な方法は、サービスを使用することです。例:

app.factory('AuthService', function() { 
    var currentUser; 

    return { 
    login: function() { ... }, 
    logout: function() { ... }, 
    isLoggedIn: function() { ... }, 
    currentUser: function() { return currentUser; } 
    ... 
    }; 
}); 

これを任意のコントローラで参照できます。次のコードは、(指定された関数を呼び出すことによって)サービスからの値の変化を監視し、変更された値をスコープに同期させます。

app.controller('MainCtrl', function($scope, AuthService) { 
    $scope.$watch(AuthService.isLoggedIn, function (isLoggedIn) { 
    $scope.isLoggedIn = isLoggedIn; 
    $scope.currentUser = AuthService.currentUser(); 
    }); 
}); 

そして、当然のことながら、その情報を使用することができます。例えばディレクティブ、テンプレートなどで呼び出すことができます。メニューコントローラなどでこれを繰り返すことができます(必要なものにカスタマイズされています)。サービスの状態を変更すると、すべて自動的に更新されます。

具体的な内容は実装によって異なります。

希望すると便利です。

+1

これも私が考えていたものですが、工場の仕組みが不思議です。コントローラーが作成され、AuthServiceを要求するたびに、別のcurrentUserコンテキストを取得しないでしょうか?たぶん私はAngularが物事をどのようにフックするかについてはっきりしていません。理想的には、私たちは一つの文脈を持つでしょう。代わりに、ngCookiesストア(私の好きなアイデアではない)やブラウザストレージ(まだ十分にサポートされていない)を使用することを考えていました。 –

+28

@ChrisNicola実際、AngularJSではすべてのサービスがシングルトンです。したがって、サービスは要求されたとき(つまりコントローラまたは別のサービスによって)最初に作成され、その後のすべての要求がまったく同じインスタンスを返します。 –

+0

@ JoshDavidMillerあなたは 'isLoggedIn'プロパティを関数として持っていますか?それはブール値ではないでしょうか? – nicholas

5

AutoshServiceは一般的に誰の関心事でもあります(誰もログに記録されていなければ誰でもログインビューが消えるはずです)ので、Joshの良い反応を修正したいと思います。 (コントローラのような)利害関係者は$scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }を使用して聞きますが、$rootScope.$broadcast('loginStatusChanged', isLoggedIn);(1)(2)を使用している場合は、

(1)$rootScopeは、(2)サービス

の引数として注入されているが、非同期ログイン操作の可能性が高い場合には、あなたはブロードキャストは物事を変更することアンギュラ通知したいだろう、ということに注意してください、それを$rootScope.$apply()機能に含めることによって、

ここでは、すべての/多数のコントローラにユーザコンテキストを保存することについては、すべてのユーザのログイン変更を聞くことができず、最上位のログインコントローラだけを聞き、コントローラをこの子の子/組み込みコントローラとして使用します。このようにして、子コントローラはあなたのユーザコンテキストのような継承した親$ scopeプロパティを見ることができます。

+4

ファクトリ関数の説明が間違っています。この誤解は、あなたの前の[このコメント](http://stackoverflow.com/questions/14206492/how-do-i-store-a-current-user-context-in-angular/14206567#comment20831205_14206567)あなたの答えを掲載しました。 –

関連する問題