在我们的应用程序中,有几个异步调用后端可能需要一些时间,我们使用"沙漏"指示器显示应用程序正忙(在那些用户不能在未处理呼叫时戳UI的情况下)。这是通过从活动控制器发出事件来完成的,该事件使得后端调用$rootScope
来监听这些事件,并引发或清除控制进度指示器显示的标志。
我在JSFiddle中完成了这个的简化版本: http://jsfiddle.net/e3vZY/
现在,在一个特定情况下,当连续两次在应用程序中完成相同的操作链时,第二次指示器无限期地停留在屏幕上,阻止所有用户操作。这是第一次按预期工作,就像许多其他地方似乎总是有效的一样。
似乎在那些麻烦的场合,事件成功发出 - 这是我通过将一个本地听众置于发出事件的同一$scope
中得到的结论(在小提琴中,有一个控制台记录调用来显示这个) - 但它永远不会到达$rootScope
中的监听器。在实际实现中,没有其他地方的事件监听器,因此我们的代码没有明确地结束任何级别的传播。
我正在谈论的一系列行动包括对后端的多次调用,多次显示和隐藏指标,切换ng-view
中的标签等。不幸的是我无法做到在小提琴中重现它的问题,所以这个问题更多的是理论上的......
什么可能导致事件无法传播到$rootScope
?
由于问题只发生在第二次完全相同的动作并且完全适用于第一次,我想象它可能与时间问题有关。
修改
我尝试将$emit
调用放在$timeout
内(没有延迟),以防影响时间但行为保持完全相同。
答案 0 :(得分:2)
我猜你在简化了jsFiddle中的代码时已经设法解决了这个问题,所以在你没有向我们展示的代码中可能存在错误。它可能不是Angular中的错误。如果你看一下angular.js中$emit()
的来源,没有任何迹象表明它可能会错过调用附加到根作用域的监听器。
也许您可以在angular.js中的$emit()
内添加一些调试代码,以获取有关正在发生的事情的更多详细信息?
修改强>
错误在评论中解释。