我在 module.run 上运行 $rootScope 分配时遇到问题。
在模块运行中有:
app.run(['$rootScope', 'UserData', function($rootScope, UserData) {
"use strict";
UserData.data().success(function(data) {
$rootScope.session = data;
});
}]);
然后,在任何 Controller 中(如果提前使用的话):
$scope.user = $rootScope.session;
它是未定义的。如果稍后使用 - 它包含所需的数据。
我猜想存在竞争条件,因为在 Controller 初始化后可能会调用 UserData.data 的回调。
我尝试在 Controller 中的 $scope.user 上使用 $scope.$apply 和 $timeout ($scope.$apply 在这里没有任何意义..),但它对我没有任何影响。
如果我尝试将 $scope.$apply 放入 app.run 中,它会给我
digest already in progress
这显然是正确的,因为默认调用 $apply 在服务中使用 $http。
我做错了什么?
我如何向 Angular 应用程序中的所有 Controller 提供数据? $rootScope 无法按我想要的方式工作,或者我做错了什么?我发现无法更新模板/ Controller 中的数据,因此当调用 app.run 中的回调时 - 数据已填充。
感谢您的帮助。
PS 奇怪的是......当我 console.log($rootScope) 时,我看到了一切 - 即使 session 对象具有正确的数据,但当我尝试 console.log($rootScope.session) 时,它是未定义的。
编辑:我发现,运行 $rootScope.$watch 可以解决该问题,但它远非干燥 - 将 watch 放在使用 rootScope 的每个作用域变量中。
最佳答案
您需要将对象包装在某种容器中。例如:
$rootScope.cont = { session: mySession };
但更好的主意是不要将 session 放在 $rootScope
上根本不。您可以将其保存在用户服务内的状态对象中,并让 Controller 注入(inject)该服务并获取 session 。
阅读本文:http://jimhoskins.com/2012/12/14/nested-scopes-in-angularjs.html我认为将有助于您的理解。
所以基本上如果你想坚持 $rootScope
,您应该像这样绑定(bind)到 Controller 中的 session :
$scope.cont = $rootScope.cont;
然后,每当您想在 View 中使用 session 对象时,您需要确保以 cont
开头。首先引用,例如<div>{{cont.session.username}}</div>
也是一个console.log
的原因显示正确的信息,而另一个显示未定义,是因为调试器(至少是 Chrome)会在您在控制台中展开对象时查看该对象。简单地过早打印该值会给你 undefined
.
关于javascript - module.run 中的 $rootScope 异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25969296/