试图找到AngularJS $rootScope.$broadcast
的一些基本信息,但AngularJS文档没有多大帮助。简单来说,为什么我们使用它?
此外,在John Papa的Hot Towel模板中,公共模块中有一个名为$broadcast
的自定义函数:
function $broadcast() {
return $rootScope.$broadcast.apply($rootScope, arguments);
}
我不明白这是做什么的。所以这里有几个基本问题:
1)$rootScope.$broadcast
做了什么?
2)$rootScope.$broadcast
和$rootScope.$broadcast.apply
之间有什么区别?
答案 0 :(得分:154)
$rootScope
基本上充当事件监听器和调度程序。
要回答如何使用它的问题,它与rootScope.$on
;
$rootScope.$broadcast("hi");
$rootScope.$on("hi", function(){
//do something
});
但是,使用$rootScope
作为您自己的应用程序的常规事件服务是一种不好的做法,因为您很快就会遇到每个应用程序都依赖于$ rootScope的情况,并且您不知道哪些组件是听什么事。
最佳做法是为您要收听或广播的每个自定义事件创建服务。
.service("hiEventService",function($rootScope) {
this.broadcast = function() {$rootScope.$broadcast("hi")}
this.listen = function(callback) {$rootScope.$on("hi",callback)}
})
答案 1 :(得分:84)
$rootScope.$broadcast
做了什么?
$rootScope.$broadcast
正在通过应用范围发送事件。
该应用程序的任何子级范围都可以使用简单的$scope.$on()
来捕获它。
当您想要到达不是直接父级的范围(例如父级的分支)时发送事件特别有用
!!!然而,不做的一件事是使用来自控制器的$rootScope.$on
。 $rootScope
是应用程序,当您的控制器被销毁时,事件监听器仍然存在,并且当您的控制器再次被创建时,它将堆积更多的事件监听器。 (因此一次广播将被多次播出)。改为使用$scope.$on()
,听众也将被销毁。
$rootScope.$broadcast
&之间有什么区别? $rootScope.$broadcast.apply
?
有时您必须使用apply()
,尤其是在使用指令和其他JS库时。但是,由于我不知道该代码库,我无法判断这是否属于这种情况。
答案 2 :(得分:32)
$ rootScope。$ broadcast 是一种提升所有子范围可以监听的“全局”事件的便捷方式。您只需使用$rootScope
来广播消息,因为所有后代范围都可以监听它。
根作用域广播事件:
$rootScope.$broadcast("myEvent");
任何子Scope都可以监听事件:
$scope.$on("myEvent",function () {console.log('my event occurred');} );
为什么我们使用$ rootScope。$ broadcast?您可以使用$watch
侦听变量更改并在变量状态更改时执行函数。但是,在某些情况下,您只需要引发应用程序的其他部分可以侦听的事件,而不管范围变量状态是否有任何更改。这是$broadcast
有用的时候。
答案 3 :(得分:14)
我想知道为什么没有人提到$broadcast
接受一个参数,你可以通过Object
使用回调函数接收$on
示例:强>
// the object to transfert
var myObject = {
status : 10
}
$rootScope.$broadcast('status_updated', myObject);
$rootScope.$on('status_updated', function(event, obj){
console.log(obj.status); // 10
})
答案 4 :(得分:8)
$ rootScope。$ broadcast做什么?
它将消息广播到角度应用程序的各个侦听器,这是一种非常强大的方法,可以将消息传输到不同层级的范围(无论是父级,子级还是兄弟级)
同样,我们有$ rootScope。$ emit,唯一的区别是前者也被$ scope。$ on捕获,而后者只被$ rootScope。$ on。
捕获。参考示例: - http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/