AngularJS事件传播——siblings?

12
我明白$emit会向DOM树上传递信息,而$broadcast会向下传递信息。那么如何在兄弟DOM元素之间发送消息呢?
3个回答

15

它不会将其发送到DOM树中。它将其发送到作用域树中,因此在处理作用域时不存在兄弟DOM元素的概念。但是,您可以使用$emit将其传递给父级,停止传播,然后广播,所有兄弟都会接收(以及它们的子级)。


11

没有机制可以向具有相同父级的范围发送消息。通常情况下,您应该从根作用域广播,因为您的消息应该是唯一的,大多数作用域都会忽略它们。您可以从父作用域广播,这样应该忽略树上更高层次和其后代的范围,但仍会传递到父级的所有后代,而不仅仅是您正在查看的范围的同级。如果您的父级不是广播所在的作用域,您始终可以忽略该消息:

$scope.$parent.$broadcast('MyUniqueEventName', data);

$scope.$on('MyUniqueEventName', function(event, data) {
    if ($scope.$parent !== event.targetScope) {
        return;
    }
    // do something with data
});

1
你只需要小心使用这种方法,因为它会紧密地耦合你的代码,你必须始终手动确保 $scope.$parent 是正确的父级,这会使你的代码更加脆弱。 - Jonathan Rowny
1
非常正确。例如,如果您在一个重复器、开关或者 if 语句中使用它,会创建一个子作用域,而您想要广播的作用域可能很容易成为上级作用域。 - Jason Goemaat

0

在我的情况下,我非常满意:

$rootScope.$broadcast('my event');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接