92

ユーザーにログインするAuthServiceがあり、ユーザーのjsonオブジェクトを返します。私がやりたいのは、そのオブジェクトを設定し、ページを更新せずにすべての変更をアプリケーション全体に反映させることです(ログイン/ログアウト状態)。

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

4

2 に答える 2

180

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

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();
  });
});

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

より具体的なものは、実装によって異なります。

お役に立てれば!

于 2013-01-08T00:41:29.257 に答える
5

AuthService は通常、誰にとっても関心があるため (たとえば、誰もログに記録されていない場合、ログイン ビュー以外のすべての人が消えるはずです)、おそらくより簡単な代替手段は、$rootScope.$broadcast('loginStatusChanged', isLoggedIn);(1 ) (2)、利害関係者 (管理者など) は を使用してリッスンし$scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }ます。

(1)$rootScopeサービスの引数として注入される

(2) 非同期ログイン操作の可能性が高いケースでは、関数に含めることによって、ブロードキャストが物事を変更することを Angular に通知する必要があることに注意してください$rootScope.$apply()

ここで、すべての/多くのコントローラーでユーザー コンテキストを保持することについて言えば、すべてのコントローラーでログインの変更をリッスンするのは好ましくなく、最上位のログイン コントローラーでのみリッスンし、他のログイン対応コントローラーを子として追加することを好むかもしれません/これの組み込みコントローラー。このようにして、子コントローラーは、ユーザー コンテキストなどの継承された親の $scope プロパティを確認できます。

于 2013-09-27T08:07:05.573 に答える