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

Angular.js - In controller wait until service returns value from server

本文关键字:服务 服务器 返回值 等待 js 控制器 角度      更新时间:2023-09-26

在我的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。"因为它看起来像是错误的决定,使代码变得丑陋。

您的建议?谢谢!

我的解决方案是使用$routeProvider.when()方法resolve选项。

这将防止控制器在数据请求完成之前加载:

$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作为依赖项注入。

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

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

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

$rootScope.initUser();

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

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

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