3

私は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

何か案は?

4

2 に答える 2

0

いくつかのことを行うことができます。ここでは、そのうちの 2 つの例を示します。このフィドルでコンソールを確認してください

1. 変数の変更を監視します。

$rootScope.user1 つ目は、コントローラーの変更を監視することです。

アプリ実行:

$timeout(function() {
    $rootScope.user = 'user';
}, 500)

あなたのコントローラーで:

$rootScope.$watch('user', function(newVal, oldVal) {
   console.log(newVal, $rootScope.user); 
});

ユーザー変数が変更されるたびにコードを実行し続けたくない場合は、「監視を解除」することもできます。

2. イベントの発行

2 つ目は、次のように、イベントを発行し、必要に応じてキャッチします。

アプリ実行:

$timeout(function() {
    $rootScope.user = 'user';
    $rootScope.$broadcast('userEvent');
}, 500)

あなたのコントローラー:

$rootScope.$on('userEvent', function() {
    console.log($rootScope.user);
});
于 2015-09-24T07:21:16.923 に答える
0

これがあなたの状況でうまくいくかどうかはわかりませんが、

$rootScope.$on('$includeContentLoaded', function () {
    //fetch user here
}

私が持っていた同様の問題を解決しました

于 2015-09-23T12:14:46.447 に答える