私はユーザーにログインするAuthServiceを持っており、ユーザーjsonオブジェクトを返します。私がしたいのは、そのオブジェクトを設定し、ページを更新することなくアプリケーション全体に反映されたすべての変更(ログイン/ログアウト状態)です。現在のユーザーコンテキストをAngularに保存するにはどうすればよいですか?
どのようにAngularJSでこれを達成できますか?
私はユーザーにログインするAuthServiceを持っており、ユーザーjsonオブジェクトを返します。私がしたいのは、そのオブジェクトを設定し、ページを更新することなくアプリケーション全体に反映されたすべての変更(ログイン/ログアウト状態)です。現在のユーザーコンテキストをAngularに保存するにはどうすればよいですか?
どのようにAngularJSでこれを達成できますか?
これを達成する最も簡単な方法は、サービスを使用することです。例:
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();
});
});
そして、当然のことながら、その情報を使用することができます。例えばディレクティブ、テンプレートなどで呼び出すことができます。メニューコントローラなどでこれを繰り返すことができます(必要なものにカスタマイズされています)。サービスの状態を変更すると、すべて自動的に更新されます。
具体的な内容は実装によって異なります。
希望すると便利です。
AutoshServiceは一般的に誰の関心事でもあります(誰もログに記録されていなければ誰でもログインビューが消えるはずです)ので、Joshの良い反応を修正したいと思います。 (コントローラのような)利害関係者は$scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }
を使用して聞きますが、$rootScope.$broadcast('loginStatusChanged', isLoggedIn);
(1)(2)を使用している場合は、
(1)$rootScope
は、(2)サービス
の引数として注入されているが、非同期ログイン操作の可能性が高い場合には、あなたはブロードキャストは物事を変更することアンギュラ通知したいだろう、ということに注意してください、それを$rootScope.$apply()
機能に含めることによって、
ここでは、すべての/多数のコントローラにユーザコンテキストを保存することについては、すべてのユーザのログイン変更を聞くことができず、最上位のログインコントローラだけを聞き、コントローラをこの子の子/組み込みコントローラとして使用します。このようにして、子コントローラはあなたのユーザコンテキストのような継承した親$ scopeプロパティを見ることができます。
ファクトリ関数の説明が間違っています。この誤解は、あなたの前の[このコメント](http://stackoverflow.com/questions/14206492/how-do-i-store-a-current-user-context-in-angular/14206567#comment20831205_14206567)あなたの答えを掲載しました。 –
これも私が考えていたものですが、工場の仕組みが不思議です。コントローラーが作成され、AuthServiceを要求するたびに、別のcurrentUserコンテキストを取得しないでしょうか?たぶん私はAngularが物事をどのようにフックするかについてはっきりしていません。理想的には、私たちは一つの文脈を持つでしょう。代わりに、ngCookiesストア(私の好きなアイデアではない)やブラウザストレージ(まだ十分にサポートされていない)を使用することを考えていました。 –
@ChrisNicola実際、AngularJSではすべてのサービスがシングルトンです。したがって、サービスは要求されたとき(つまりコントローラまたは別のサービスによって)最初に作成され、その後のすべての要求がまったく同じインスタンスを返します。 –
@ JoshDavidMillerあなたは 'isLoggedIn'プロパティを関数として持っていますか?それはブール値ではないでしょうか? – nicholas