rootScope美元。$broadcast vs. $scope.$emit

现在,$broadcast$emit之间的性能差异已经消除,是否有任何理由更喜欢$scope.$emit而不是$rootScope.$broadcast?

是的,他们是不同的。

$emit被限制在作用域层次结构(向上)-如果它适合你的设计,这可能是好的,但对我来说,这似乎是一个相当武断的限制。

$rootScope.$broadcast在所有选择之间工作来监听事件,在我看来这是一个更合理的限制。

我遗漏了什么吗?

编辑:

澄清一下,派遣的方向不是我所关注的问题。$scope.$emit向上分派事件,而$scope.$broadcast向下分派事件。但是为什么不总是使用$rootScope.$broadcast来达到所有预期的侦听器呢?

153127 次浏览

它们所做的工作并不相同:$emit通过作用域层次分派事件向上,而$broadcast将事件向下分派给所有子作用域。

艾迪对所问的问题给出了完美的答案。 但我想提请大家注意使用更有效的Pub/Sub方法

正如的答案所示,

$broadcast/$on方法不是非常有效,因为它向所有作用域广播(在作用域层次结构的一个方向或两个方向)。而Pub/Sub方式要直接得多。只有订阅者才能获得事件,因此不需要到系统中的每个作用域才能使其工作。

你可以使用angular-PubSub angular模块。一旦你将PubSub模块添加到你的应用依赖项中,你就可以使用PubSub服务来订阅和取消订阅事件/主题。

订阅方便:

// Subscribe to event
var sub = PubSub.subscribe('event-name', function(topic, data){
    

});

易于发布

PubSub.publish('event-name', {
prop1: value1,
prop2: value2
});

要取消订阅,请使用PubSub.unsubscribe(sub);PubSub.unsubscribe('event-name');

不要忘记取消订阅以避免内存泄漏。

我用下面的链接制作了下面的图形:https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

Scope, rootScope, emit, broadcast

正如你所看到的,$rootScope.$broadcast$scope.$emit击中更多的侦听器。

另外,$scope.$emit的冒泡效果可以取消,而$rootScope.$broadcast不能。

在服务中使用RxJS

例如,如果你有一个处于保持状态的服务。我如何将更改推送到该服务,以及页面上的其他随机组件如何知道此类更改?最近一直在努力解决这个问题

使用Angular的RxJS扩展构建服务。

<script src="//unpkg.com/angular/angular.js"></script>
<script src="//unpkg.com/rx/dist/rx.all.js"></script>
<script src="//unpkg.com/rx-angular/dist/rx.angular.js"></script>
var app = angular.module('myApp', ['rx']);


app.factory("DataService", function(rx) {
var subject = new rx.Subject();
var data = "Initial";


return {
set: function set(d){
data = d;
subject.onNext(d);
},
get: function get() {
return data;
},
subscribe: function (o) {
return subject.subscribe(o);
}
};
});

然后只需订阅这些更改。

app.controller('displayCtrl', function(DataService) {
var $ctrl = this;


$ctrl.data = DataService.get();
var subscription = DataService.subscribe(function onNext(d) {
$ctrl.data = d;
});


this.$onDestroy = function() {
subscription.dispose();
};
});

客户端可以使用DataService.subscribe订阅更改,生产者可以使用DataService.set推送更改。

演示在PLNKR

enter image description here

美元的范围。$emit:这个方法向上分发事件(从子对象到父对象)

enter image description here 美元的范围。$broadcast:方法向下分发事件(从父控制器到子控制器)到所有子控制器

enter image description here 美元的范围。$on:方法注册监听某个事件。所有正在侦听该事件的控制器获得广播或发出的通知 这是孩子和父母之间的关系。< / p >

$emit事件可以被监听该事件的任何一个$作用域取消。

$on提供了“stopPropagation”方法。通过调用此方法,可以阻止事件进一步传播。

砰砰作响:https://embed.plnkr.co/0Pdrrtj3GEnMp2UpILp4/

对于兄弟作用域(不在直接父子层次结构中的作用域),则$emit和$broadcast将不会与兄弟作用域通信。

enter image description here

更多详情请参考 http://yogeshtutorials.blogspot.in/2015/12/event-based-communication-between-angularjs-controllers.html < / p >