2014-09-22 55 views
1

我在运行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。$ apply和$ timeout($ scope。$ apply在这里没有任何意义..)在控制器中的$ scope.user,它没有任何效果。

如果我试图把$范围。在app.run $应用它gaves我

消化正在进行中

这显然是真实的,如$ HTTP通过defauly在服务中使用调用$ apply。

我在做什么错了?

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

感谢您的任何帮助。当我console.log($ rootScope)我看到一切 - 甚至与会议对象与正确的数据,但是当我尝试console.log($ rootScope.session)它的未定义。编辑:我发现,运行$ rootScope。$ watch解决了这个问题,但它远没有DRY--将监视放在使用rootScope的每个范围变量中。

回答

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显示正确的信息,而其他节目不确定,是因为(至少铬)调试器将着眼于当时的对象,你展开它在控制台的原因。如果只是简单地打印价值会给你undefined

+0

哦! Chrome让我感到困惑......我不知道这一点。 thans! 我会尝试这两个解决方案。 – Jarema 2014-09-22 08:18:45

+0

顺便说一句,把它放在没有监视器的容器中只给出空对象。 $手表仍然需要。我知道如何嵌套范围工作(我猜:))。我遇到的问题是在app.run和控制器中运行的rootScope之间有一些数据绑定的问题,但我很难确定。 – Jarema 2014-09-22 08:24:06

+0

我的猜测是你仍然试图直接绑定到会话。你绝对不需要'$ watch',所以我已经更新了我的答案。 – 2014-09-22 21:31:28