Angularjs Angular 1.5:停止具有多个侦听器的rootScope发射

Angularjs Angular 1.5:停止具有多个侦听器的rootScope发射,angularjs,Angularjs,我有多个控制器在侦听一个rootScope事件。如果我有逻辑来停止每个控制器中事件的传播,那么每个控制器中的侦听器还会触发吗 我想知道在一个控制器中停止传播事件与其他控制器中的其他事件侦听器之间是否存在竞争条件。这取决于您的层次结构。如果正在广播,并且在控制器的侦听器中调用preventDefault(),则只能保证在控制器范围内定义的侦听器(该控制器的子控制器)将defaultPrevented标志设置为true。由于DOM顺序决定了哪些同级将设置该标志,因此不能保证同级设置该标志。其他控制器

我有多个控制器在侦听一个rootScope事件。如果我有逻辑来停止每个控制器中事件的传播,那么每个控制器中的侦听器还会触发吗


我想知道在一个控制器中停止传播事件与其他控制器中的其他事件侦听器之间是否存在竞争条件。

这取决于您的层次结构。如果正在广播,并且在控制器的侦听器中调用
preventDefault()
,则只能保证在控制器范围内定义的侦听器(该控制器的子控制器)将
defaultPrevented
标志设置为true。由于DOM顺序决定了哪些同级将设置该标志,因此不能保证同级设置该标志。其他控制器作用域中非子体的其他侦听器将不会将
defaultPrevented
标志设置为true

因此,不必担心竞争条件,但必须了解范围层次结构

需要注意的是,您只能对
$emit
-ed事件执行
停止播放操作
,而不能对
$broadcast
-ed事件执行操作。此外,
$emit
-ed事件在作用域层次结构中向上移动,因此,如果您是从
$rootScope
执行
$emit
-ing操作,则只有
$rootScope
上的侦听器才会收到消息

此外,在控制器内的
$rootScope
上创建侦听器是一个非常糟糕的主意。原因是控制器通常会反复初始化和销毁。但是在
$rootScope
上定义的侦听器不会随控制器一起销毁。这意味着您将在每次实例化控制器时向
$rootScope
添加重复的侦听器,从而触发多个重复的侦听器

$on
方法的文档中:

stopPropagation
-{function=}:调用stopPropagation函数将 取消进一步的事件传播(仅适用于 $ed) 因此,如果您正在
$emit
-ing事件,则可以使用此选项

否则,如果您是
$broadcast
-ing

preventDefault
-{function}:调用preventDefault集
defaultPrevented
标记为true。
defaultPrevented
-{boolean}:如果 默认值被调用