如何在AngularJS中停止$ broadcast事件?

Noa*_*tas 30 angularjs angularjs-scope

是否有内置的方法来阻止$broadcast事件沿着范围链走下去?

事件传递的事件对象$broadcast没有stopPropagation方法(就像$ rootScope提到的文档一样.)但是这个合并的pull请求表明$broadcast事件可以stopPropagation调用它们.

kos*_*tik 43

来自angularJS 1.1.2的片段源代码:

$emit: function(name, args) {
    // ....
    event = {
        name: name,
        targetScope: scope,
        stopPropagation: function() {
            stopPropagation = true;
        },
        preventDefault: function() {
            event.defaultPrevented = true;
        },
        defaultPrevented: false
    },
    // ....
}

$broadcast: function(name, args) {
    // ...
    event = {
        name: name,
        targetScope: target,
        preventDefault: function() {
            event.defaultPrevented = true;
        },
        defaultPrevented: false
    },
    // ...
}
Run Code Online (Sandbox Code Playgroud)

正如你可以看到$ broadcast中的事件对象没有"stopPropagation".

您可以使用preventDefault而不是stopPropagation将事件标记为"不需要处理此事件".这不会停止事件传播,但这会告诉孩子范围:"不需要处理此事件"

示例:http://jsfiddle.net/C8EqT/1/


Mah*_*ngh 7

由于广播没有stopPropagation方法,因此您需要使用defaultPrevented属性,这在递归指令中是有意义的.

在这里看看这个plunker:Plunkr

$scope.$on('test', function(event) { if (!event.defaultPrevented) { event.defaultPrevented = true; console.log('Handle event here for the root node only.'); } });