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 回答