angularjs - 从 Controller $scope 发出的事件 $ 并不总是到达 $rootScope 中定义的监听器

标签 angularjs

在我们的应用程序中,有几个对后端的异步调用可能需要一些时间,我们使用一个“沙漏”指示器来显示应用程序很忙(在那些情况下,当用户在运行时不允许戳 UI)未处理调用)。这是通过从主动 Controller 发出事件来完成的,这些事件使后端调用 $rootScope它监听这些事件并引发或清除控制进度指示器显示的标志。

我在 JSFiddle 中做了一个简化版本:
http://jsfiddle.net/e3vZY/

现在,在一种特殊情况下,当应用程序中连续两次执行相同的一系列操作时,第二次指示器会无限期地停留在屏幕上,阻止所有用户操作。第一次它按预期工作,就像在许多其他地方一样,同样的方法似乎总是有效。

似乎在那些麻烦的情况下,事件成功发出 - 我通过将本地监听器放在同一个 $scope 中得出的结论。作为事件从哪里发出(在 fiddle 中,有一个控制台日志记录调用来显示这一点) - 但它永远不会到达 $rootScope 中的监听器.在实际实现中,其他地方没有事件的监听器,因此我们的代码不会在任何级别上明确结束传播。

我正在谈论的一系列操作包括对后端的多次调用、多次显示和隐藏指标、在 ng-view 中切换选项卡。等等。不幸的是,我无法在 fiddle 中重现这个问题,所以这个问题更像是理论上的......

什么可能导致事件无法传播到 $rootScope ?

由于该问题仅在第二次发生,因此采取完全相同的操作并在第一次完美运行,我想它可能与时间问题或其他问题有关。

编辑:

我试着把 $emit调用内部 $timeout (没有延迟)以防会影响时间但行为保持完全相同。

最佳答案

我猜您在简化 jsFiddle 中的代码时已经设法解决了问题,因此您没有向我们展示的代码中可能存在错误。这可能不是 Angular 中的错误。如果你看$emit()的来源在 angular.js 中,没有任何迹象表明它可能会错过调用附加到根作用域的监听器。

也许您可以在 $emit() 中添加一些调试代码在 angular.js 中获取有关正在发生的事情的更多详细信息?

编辑

该错误在评论中进行了解释。

关于angularjs - 从 Controller $scope 发出的事件 $ 并不总是到达 $rootScope 中定义的监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22527558/

相关文章:

javascript - AngularJS 按钮单击绑定(bind)值到输入

javascript - Angular 验证 - 启用/禁用输入字段会更改表单的有效性

javascript - Angular Directive(指令)表行问题

angularjs - Yeoman 的 Angular.js Codelab - 修复测试

javascript - Ionic Angular/为什么在 Controller 功能结束之前不调用服务

javascript - 尝试将页面对象与 Protractor 一起使用时出现“对象不是函数”错误

javascript - 动态更改 ng-repeat 内的按钮标签

angularjs - PUT/DELETE 出现 403 错误,但 GET/POST 有效

javascript - 如何使用 ng-model 在文本框中预填充值

asp.net-mvc - 由于输入文本框的过滤而导致绑定(bind)列表发生更改时, Angular 分页不会更新