ユーザーにログインするAuthServiceがあり、ユーザーのjsonオブジェクトを返します。私がやりたいのは、そのオブジェクトを設定し、ページを更新せずにすべての変更をアプリケーション全体に反映させることです(ログイン/ログアウト状態)。
AngularJSでこれをどのように達成しますか?
ユーザーにログインするAuthServiceがあり、ユーザーのjsonオブジェクトを返します。私がやりたいのは、そのオブジェクトを設定し、ページを更新せずにすべての変更をアプリケーション全体に反映させることです(ログイン/ログアウト状態)。
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();
});
});
そしてもちろん、その情報を適切に使用することができます。たとえば、ディレクティブ、テンプレートなど。メニュー コントローラーなどでこれを繰り返すことができます (必要に応じてカスタマイズ)。サービスの状態を変更すると、すべて自動的に更新されます。
より具体的なものは、実装によって異なります。
お役に立てれば!
AuthService は通常、誰にとっても関心があるため (たとえば、誰もログに記録されていない場合、ログイン ビュー以外のすべての人が消えるはずです)、おそらくより簡単な代替手段は、$rootScope.$broadcast('loginStatusChanged', isLoggedIn);
(1 ) (2)、利害関係者 (管理者など) は を使用してリッスンし$scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }
ます。
(1)$rootScope
サービスの引数として注入される
(2) 非同期ログイン操作の可能性が高いケースでは、関数に含めることによって、ブロードキャストが物事を変更することを Angular に通知する必要があることに注意してください$rootScope.$apply()
。
ここで、すべての/多くのコントローラーでユーザー コンテキストを保持することについて言えば、すべてのコントローラーでログインの変更をリッスンするのは好ましくなく、最上位のログイン コントローラーでのみリッスンし、他のログイン対応コントローラーを子として追加することを好むかもしれません/これの組み込みコントローラー。このようにして、子コントローラーは、ユーザー コンテキストなどの継承された親の $scope プロパティを確認できます。