私はAngularJSでSPAに取り組んでいます。サインイン後、トークンを使用して Cookie が作成され、$rootScope.user
動的に読み込まれるさまざまなコントローラーから簡単にアクセスできるユーザー オブジェクトが格納されます。
通常どおり使用してナビゲートすると、アプリケーションは正常に動作します。
F5 でページを更新すると、Angular がリロードされ、モジュールの run() メソッドが Cookie が存在するかどうかを確認し、サーバーからユーザーを にリロードします$rootScope.user
。ただし、これが発生している間、別のコントローラーが既に$rootScope.user
ユーザーを持っていることを期待しています。
$rootScope.user
準備ができてロードされる前にコントローラーの初期化を防ぐにはどうすればよいですか。もちろん、ユーザーがロードされているかどうかコントローラーをチェックインできる場合$rootScope
。$rootScope
しかし、そうでない場合、コントローラーを呼び出して初期化を実行するにはどうすればよいでしょうか?
app.run() のコードは次のとおりです。
app.run(function ($rootScope, $location, $cookies, appServices) {
var token = $cookies.get('UserToken');
if (token) $rootScope.token = token;
$rootScope.$on("$routeChangeStart", function (event, next, current) {
// Get user from server if token is there but no user
if ($rootScope.user == null) {
if ($rootScope.token) {
appServices.getUserByToken(token).then(function (d) {
if (d.Code == 1) {
$rootScope.user = d.ReturnObj;
if ($rootScope.user != null && next.templateUrl == "web/views/signin.html") $location.path("/dashboard");
} else $rootScope.goSignin(next.templateUrl);
});
}
else $rootScope.goSignin(next.templateUrl);
}
});
})
動的に読み込まれるコントローラーのサンプル コードを次に示します。
app.registerCtrl('userdetailCtrl', function userdetailCtrl($scope, $http, $rootScope, $routeParams, appServices, $location, validationService) {
$scope.getOffices=function()
{
appServices.getOffices({ ID: $rootScope.user.OrgID, Token: $rootScope.token }).then(function (d){
if(d.Code==1){$scope.office = d.ReturnObj;}});
}
$scope.getOffices();
});
このgetOffices()
関数は を必要としますが、まだロードさ$rootScope.user.OrgID
れていないため見つかりません。$rootScope.user
何か案は?