为什么我们在 AngularJS 中使用 $rootScope. $Broadcasting?

试图找到一些 AngularJS $rootScope.$broadcast的基本信息,但 AngularJS 文档没有多大帮助。简单地说,我们为什么要用这个?

此外,在 John Papa 的 热毛巾模板中,有一个名为 $broadcast的通用模块中的自定义函数:

function $broadcast() {
return $rootScope.$broadcast.apply($rootScope, arguments);
}

我不明白这是在做什么,所以这里有几个基本的问题:

1) $rootScope.$broadcast是做什么的?

2) What is the difference between $rootScope.$broadcast and $rootScope.$broadcast.apply?

157905 次浏览

$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)}
})

$rootScope. $Broadcasting 是做什么的?

它通过有角度的应用程序向各个监听器广播消息,这是一种非常强大的方法,可以将消息传输到不同层次级别(父级、子级或兄弟级)的范围

类似地,我们有 $rootScope。唯一的区别是前者也被 $scope 捕获。$on,而后者仅被 $rootScope 捕获。$.

参考例子:-http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

$rootScope.$Broadcasting 是引发所有子作用域都可以侦听的“全局”事件的一种方便方法。您只需要使用 $rootScope来广播消息,因为所有子代作用域都可以监听它。

根作用域广播事件:

$rootScope.$broadcast("myEvent");

Scope 可以监听事件:

$scope.$on("myEvent",function () {console.log('my event occurred');} );

为什么使用 $rootScope。$广播?您可以使用 $watch侦听变量更改,并在变量状态更改时执行函数。但是,在某些情况下,您只是想引发应用程序的其他部分可以侦听的事件,而不管范围变量状态发生了什么变化。这时 $broadcast是有帮助的。

  1. What does $rootScope.$broadcast do?

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

    当您希望到达一个不是直接父级的作用域(例如父级的一个分支)时,发送事件特别有用

    !!!然而,对于 不做来说,一件事情是从控制器中使用 $rootScope.$on$rootScope是应用程序,当您的控制器被销毁时,事件侦听器仍然存在,并且当您的控制器将再次创建时,它将堆积更多的事件侦听器。(所以一个广播会被多次捕捉到)。而使用 $scope.$on(),侦听器也会被销毁。

  2. $rootScope.$broadcast$rootScope.$broadcast.apply有什么不同?

    有时必须使用 apply(),特别是在使用指令和其他 JS 库时。但是因为我不知道那个代码库,所以我无法判断这里的情况是否如此。

传递数据! ! !

I wonder why no one mention that $broadcast accept a parameter where you can pass an Object

例如:

// the object to transfert
var obj = {
status : 10
}


$rootScope.$broadcast('status_updated', obj);
$scope.$on('status_updated', function(event, obj){
console.log(obj.status); // 10
})