Angular.js - 在控制器中等待服务从服务器返回值

时间:2014-04-03 17:25:26

标签: javascript angularjs controller scope rootscope

在我的 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之后强制所有控制器加载。我不想在每个控制器中为用户添加{{1}}。'因为它看起来像是错误的决定并且使代码变得丑陋。

你的建议?谢谢!

2 个答案:

答案 0 :(得分: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作为依赖。

答案 1 :(得分:2)

我遇到了同样的问题。我找到的唯一解决方案是在rootScope中创建一些函数并从控制器中调用它。所以app.run函数有类似的内容:

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

然后我的控制器在开始时调用它:

$rootScope.initUser();

不要忘记将$ rootScope注入控制器。

这个解决方案并不是假装优雅,但至少它有效...

如果有人建议更好的解决方案,我将不胜感激......