3

私のAngular.jsアプリケーションでは、このような問題に悩まされています。呼び出されるサービスがあり、次のようにサーバーからユーザーデータを取得するためuserに呼び出します。app.run

app.run(function (user, tracking) {
    user.initialize();
    ... // some other code goes here..
});

これは単純に API ルートを呼び出し$rootScope.user、すべてのアプリケーションで使用できるように作成します。

しかし、どういうわけか、コントローラーのロードが高速になり、初期化が行われることがあります..そして、その内部にはオブジェクト$rootScopeが含まれていません。user

function SomeController($scope, $rootScope, $routeParams) {
   console.log($rootScope.user.name); 
   // sometimes returns error -
   // TypeError: Cannot read property 'name' of undefined
}

では、初期化がうまくいった後にのみ、すべてのコントローラーを強制的にロードするにはどうすればよいですか$rootScope。すべてのコントローラーにユーザーを追加したくありません$watch..それは悪い決定のように見え、コードが醜くなるからです。

あなたの提案は?ありがとう!

4

2 に答える 2

3

私の解決策は、メソッドresolveのオプションを使用することです。$routeProvider.when()

これにより、データへのリクエストが完了する前にコントローラーがロードされなくなります。

$routeProvider.when('/books', { 
  templateUrl: 'books', 
  controller: 'bookCtrl',
  resolve: {
    appUser: function (user) {
       // we're injecting "user" service
       // and initiliazing it (this method returns $promise)
       return user.initialize();
    }
  }  
});

そして、依存関係としてbookCtrl注入するだけです。appUser

于 2014-04-19T14:12:29.857 に答える
2

私も同じ問題を抱えていました。私が見つけた唯一の解決策は、rootScope で関数を作成し、コントローラーから呼び出すことでした。したがって、 app.run 関数の内部には次のようなものがあります。

scope.initUser = function () {
   if (!user){
   // create
      user.initialize();
   }
};

そして、私のコントローラーは最初にそれを呼び出します:

$rootScope.initUser();

$rootScope をコントローラーに挿入することを忘れないでください。

このソリューションはエレガントなふりをしていませんが、少なくとも機能します...

誰かがより良い解決策を提案してくれれば幸いです...

于 2014-04-03T18:11:42.367 に答える