javascript - module.run 中的 $rootScope 异步调用

标签 javascript angularjs

我在 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/

相关文章:

javascript - 在 vue.js 中更新数据属性/对象

javascript - 如何在 Angular 中禁用 img?

android - Android 上的 Ionic App 不发送 http 请求

angularjs - 更改我的项目文件不会更改 Docker 机器内的文件

javascript - 如何在 AngularJS 中使用 JSON 数组?

javascript - 使用 useRef 更改输入值

javascript - 每当一个 div 的一部分与另一个 div 的一部分重叠时触发一个事件

Javascript:Onclick 事件在 IE 中不起作用

javascript - JQUERY 整数和字符串加法

angularjs - 使用 Protractor 测试临时元素的内容