回答:
これを行う最も簡単な方法は、サービスを使用することです。例えば:
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。これは、ページの更新だけでなく、新しいタブでリンクを開く人にも役立ちます。
ui-router)とルート解決は、認証制御をDRYに保つための良い方法です。あなたが書いたものは正しいと思います。
AuthServiceは通常誰でも関心があるため(つまり、誰もログインしていない場合は、ログインビュー以外はすべて表示されないはずです)、もっと簡単な代替策は、$rootScope.$broadcast('loginStatusChanged', isLoggedIn);(1 )(2)、関係者(コントローラなど)はを使用してリッスンし$scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }ます。
(1)$rootScopeサービスの引数として挿入される
(2)非同期ログイン操作が発生する可能性が高い場合、Angularに、ブロードキャストを変更して、$rootScope.$apply()関数に含めることで通知する必要があることに注意してください。
ここで、すべての/多くのコントローラーでユーザーコンテキストを維持することについて言えば、すべてのコントローラーでログインの変更をリッスンすることに満足できず、最上位のログインコントローラーでのみリッスンし、他のログイン対応コントローラーを子として追加することを好むかもしれません/これの組み込みコントローラー。このようにして、子コントローラーは、ユーザーコンテキストなどの継承された親$ scopeプロパティを確認できます。