module.run中的$ rootScope异步调用

时间:2014-09-22 08:04:51

标签: javascript angularjs

在module.run上运行时,我遇到了$ rootScope assingnment的问题。

在模块运行中有:

app.run(['$rootScope', 'UserData', function($rootScope, UserData) {
    "use strict";
    UserData.data().success(function(data) {
        $rootScope.session = data;
    });
}]);

然后,在任何控制器中如果早期使用:

$scope.user = $rootScope.session;

未定义。如果以后使用 - 它包含所需的数据。

我猜有竞争条件,因为在初始化控制器后可能会调用来自UserData.data的回调。

我在$ scope.user控制器中尝试$ scope。$ apply和$ timeout($ scope。$ apply没有任何意义..)它对我没有影响。

如果我尝试将$ scope。$ app应用于app.run,它会让我

  

摘要已在进行中

这显然是正确的,因为$ http在服务中通过defauly调用$ apply。

我做错了什么?

如何在角度应用程序中为所有控制器提供数据? $ rootScope不能像我想要的那样工作,或者我做错了什么?我看不到更新模板/控制器中的数据,所以当app.run中的回调被调用时,-data被填充。

感谢您的帮助。

PS奇怪的是......当我在console.log($ rootScope)时,我看到了一切 - 即使会话对象有正确的数据,但是当我尝试console.log($ rootScope.session)时,它是未定义的。

编辑:我发现,运行$ rootScope。$ watch解决了这个问题,但它远不是DRY - 将监视放在使用rootScope的每个范围变量中。

1 个答案:

答案 0 :(得分:0)

您需要将对象包装在某种容器中。例如:

$rootScope.cont = { session: mySession };

但更好的想法是不要将会话放在$rootScope上。您可以将其保存在用户服务中的状态对象中,让控制器注入该服务并获取会话。

阅读本文:http://jimhoskins.com/2012/12/14/nested-scopes-in-angularjs.html将有助于您的理解。

所以基本上如果你想坚持使用$rootScope,你应该在控制器中绑定你的会话,如下所示:

$scope.cont = $rootScope.cont;

然后,只要您想在视图中使用会话对象,就需要确保首先使用cont引用,例如。 <div>{{cont.session.username}}</div>


另外一个console.log显示正确信息的原因,而另一个显示未定义的原因,是因为调试器(至少是chrome)将在控制台中展开它时查看对象。如果只是过早地打印该值就会给你undefined