从控制器$ scope发出的事件$并不总是到达$ rootScope中定义的侦听器

时间:2014-03-20 08:42:09

标签: angularjs

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

我在JSFiddle中完成了这个的简化版本: http://jsfiddle.net/e3vZY/

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

似乎在那些麻烦的场合,事件成功发出 - 这是我通过将一个本地听众置于发出事件的同一$scope中得到的结论(在小提琴中,有一个控制台记录调用来显示这个) - 但它永远不会到达$rootScope中的监听器。在实际实现中,没有其他地方的事件监听器,因此我们的代码没有明确地结束任何级别的传播。

我正在谈论的一系列行动包括对后端的多次调用,多次显示和隐藏指标,切换ng-view中的标签等。不幸的是我无法做到在小提琴中重现它的问题,所以这个问题更多的是理论上的......

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

由于问题只发生在第二次完全相同的动作并且完全适用于第一次,我想象它可能与时间问题有关。

修改

我尝试将$emit调用放在$timeout内(没有延迟),以防影响时间但行为保持完全相同。

1 个答案:

答案 0 :(得分:2)

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

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

修改

错误在评论中解释。