在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的每个范围变量中。
答案 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
。