- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我们的应用程序中,有几个对后端的异步调用可能需要一些时间,我们使用一个“沙漏”指示器来显示应用程序很忙(在那些情况下,当用户在运行时不允许戳 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/
我是一名优秀的程序员,十分优秀!