【问题标题】:Angular.js - In controller wait until service returns value from serverAngular.js - 在控制器中等待服务从服务器返回值
【发布时间】:2014-04-03 17:25: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 .. 因为它看起来像一个错误的决定并且使代码变得丑陋。

您的建议?谢谢!

【问题讨论】:

  • 你使用ngRoute吗?因为上面有resolve,你可以使用它。
  • @IqbalFauzi 是的,我使用ngRoute。这是否意味着我需要在每个控制器上的 resolve 内调用 user.initialize()?

标签: javascript angularjs controller scope rootscope


【解决方案1】:

我的解决方案是使用$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 作为依赖注入。

【讨论】:

    【解决方案2】:

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

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

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

    $rootScope.initUser();
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-18
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多