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



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

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

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

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

应该注意的是,您只能stopPropagation$emit-ed 事件,而不能$broadcast-ed 事件。此外,$emit-ed 事件会向上移动作用域层次结构,因此,如果要从$rootScope$emit-ing,则只有$rootScope上的侦听器才会收到消息。

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

$on方法的文档中:

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

否则,如果您$broadcast-ing...

preventDefault- {函数}:调用阻止默认集defaultPrevented标志为真。defaultPrevented- {布尔值}:如果为真 已调用阻止默认。

相关内容

最新更新