为什么我们在AngularJS中使用$ rootScope。$ broadcast?

时间:2014-07-18 17:29:34

标签: angularjs rootscope

试图找到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之间有什么区别?

5 个答案:

答案 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)

  1. $rootScope.$broadcast做了什么?

    $rootScope.$broadcast正在通过应用范围发送事件。 该应用程序的任何子级范围都可以使用简单的$scope.$on()来捕获它。

    当您想要到达不是直接父级的范围(例如父级的分支)时发送事件特别有用

    !!!然而,不做的一件事是使用来自控制器的$rootScope.$on$rootScope是应用程序,当您的控制器被销毁时,事件监听器仍然存在,并且当您的控制器再次被创建时,它将堆积更多的事件监听器。 (因此一次广播将被多次播出)。改为使用$scope.$on(),听众也将被销毁。

  2. $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/