AngularJS 笔记——$on、$emit和$broadcast的使用与区别

  AngularJS中的作用域有一个非常有层次和嵌套分明的结构。其中它们都有一个主要的$rootScope(也就说对应的Angular应用或者ng-app),然后其他所有的作用域部分都是继承自这个$rootScope的,或者说都是嵌套在主作用域下面的。很多时候,你会发现这些作用域不会共享变量或者说都不会从另一个原型继承什么。

那么在这种情况下,如何在作用域之间通信呢?其中一个选择就是在应用程序作用域之中创建一个单例服务,然后通过这个服务处理所有子作用域的通信。

在AngularJS中还有另外一个选择:通过作用域中的事件处理通信。但是这种方法有一些限制;例如,你并不能广泛的将事件传播到所有监控的作用域中。你必须选择是否与父级作用域或者子作用域通信。

  $on、$emit和$broadcast使得event、data在controller之间的传递变的简单。

区别 1:

  • 发送消息: $scope.$emit(name, data) 或者 $scope.$broadcast(name, data);
  • 接收消息: $scope.on(name,function(event,data){ });

区别 2:

  • $emit 广播给父controller   $broadcast 广播给子controller
  • broadcast 是从发送者向他的子scope广播一个事件。
  • $emit 广播给父controller,父controller 是可以收到消息
  • $on 有两个参数function(event,msg)  第一个参数是事件对象,第二个参数是接收到消息信息

例子如下:

html代码

1 <div ng-controller="ParentCtrl">                <!--父级-->
2     <div ng-controller="SelfCtrl">              <!--自己-->
3         <a ng-click="click()">click me</a>
4         <div ng-controller="ChildCtrl"></div>   <!--子级-->
5     </div>
6     <div ng-controller="BroCtrl"></div>         <!--平级-->
7 </div>

js代码

 1 app.controller(‘SelfCtrl‘, function($scope) {
 2   $scope.click = function () {
 3     $scope.$broadcast(‘to-child‘, ‘child‘);
 4     $scope.$emit(‘to-parent‘, ‘parent‘);
 5   }
 6 });
 7
 8 app.controller(‘ParentCtrl‘, function($scope) {
 9   $scope.$on(‘to-parent‘, function(event,data) {
10     console.log(‘ParentCtrl‘, data);       //父级能得到值
11   });
12   $scope.$on(‘to-child‘, function(event,data) {
13     console.log(‘ParentCtrl‘, data);       //子级得不到值
14   });
15 });
16
17 app.controller(‘ChildCtrl‘, function($scope){
18   $scope.$on(‘to-child‘, function(event,data) {
19     console.log(‘ChildCtrl‘, data);         //子级能得到值
20   });
21   $scope.$on(‘to-parent‘, function(event,data) {
22     console.log(‘ChildCtrl‘, data);         //父级得不到值
23   });
24 });
25
26 app.controller(‘BroCtrl‘, function($scope){
27   $scope.$on(‘to-parent‘, function(event,data) {
28     console.log(‘BroCtrl‘, data);          //平级得不到值
29   });
30   $scope.$on(‘to-child‘, function(event,data) {
31     console.log(‘BroCtrl‘, data);          //平级得不到值
32   });
33 });

最终结果:

ParentCtrl child

ChildCtrl parent

$emit和$broadcast可以传多个参数,$on也可以接收多个参数。

在$on的方法中的event事件参数,其对象的属性和方法如下:

事件属性 目的
event.targetScope 发出或者传播原始事件的作用域
event.currentScope 目前正在处理的事件的作用域
event.name 事件名称
event.stopPropagation() 一个防止事件进一步传播(冒泡/捕获)的函数(这只适用于使用`$emit`发出的事件)
event.preventDefault() 这个方法实际上不会做什么事,但是会设置`defaultPrevented`为true。直到事件监听器的实现者采取行动之前它才会检查`defaultPrevented`的值。
event.defaultPrevented 如果调用了`preventDefault`则为true

学习:http://www.cnblogs.com/CraryPrimitiveMan/p/3679552.html

时间: 2024-08-05 15:25:13

AngularJS 笔记——$on、$emit和$broadcast的使用与区别的相关文章

angularjs的$on、$emit、$broadcast

如何在作用域之间通信呢? 1.创建一个单例服务,然后通过这个服务处理所有子作用域的通信. 2.通过作用域中的事件处理通信.但是这种方法有一些限制:例如,你并不能广泛的将事件传播到所有监控的作用域中.你必须选择是否与父级作用域或者子作用域通信. $on.$emit和$broadcast使得event.data在controller之间的传递变的简单.$emit:子传父 传递event与data$broadcast:父传子 child controller传递event与data$on:监听或接收数

AngularJS的学习 $on、$emit和$broadcast的使用

$on.$emit和$broadcast使得event.data在controller之间的传递变的简单. $emit只能向parent controller传递event与data $broadcast只能向child controller传递event与data $on用于接收event与data 请看博客:http://www.it165.net/pro/html/201404/12610.html

angularJS 系列(六)---$emit(), $on(), $broadcast()的使用

下面以一个例子来讲述 angular 中的event system,有$emit(), $on(), $broadcast().效果图如下 下面的代码中,用到了 controller AS 的语法,具体这种语法的使用情况,好处或是与 原来 直接在 Controller中把视图对象直接绑定到 $scope 对象上面的区别, 可以查看我之前的一片博文. 直接贴代码 <!DOCTYPE html> <html> <head> <link rel="styles

angularJs--$on、$emit和$broadcast的使用

$emit只能向parent controller传递event与data $broadcast只能向child controller传递event与data $on用于接收event与data 例子如下 html代码 <div ng-controller="ParentCtrl"> <!--父级--> <div ng-controller="SelfCtrl"> <!--自己--> <a ng-click=&q

Angular $scope和$rootScope事件机制之$emit、$broadcast和$on

Angular按照发布/订阅模式设计了其事件系统,使用时需要"发布"事件,并在适当的位置"订阅"或"退订"事件,就像邮箱里面大量的订阅邮件一样,当我们不需要时就可以将其退订了.具体到开发中,对应着$scope和$rootScope的$emit.$broadcast和$on方法.本文介绍Angular的事件机制,包括$scope和$rootScope处理事件上的异同,$broadcast.$emit和$on的使用方式及他们区别等内容. $scope

AngularJS 事件$emit 和$broadcast

页面之间信息传递(子页面->父页面), $emit冒泡事件. 要把事件沿着作用域链向上派送(从子作用域到父作用域),我们要使用$emit()函数 在一个 $emit()事件函数的调用中,事件从子作用域冒泡到父作用域.在产生事件的作用域 之上的所有作用域都会收到这个事件的通知. 当想要跟应用的其他部分交流状态的变更时,我们使用$emit().如果想要跟$rootScope通信,需要$emit()这个事件. $emit()方法带有两个参数. 1.name(字符串)要发出的事件名称. 2.args(集

$on、$emit和$broadcast的使用

$emit只能向parent controller传递event与data( $emit(name, args) ) $broadcast只能向child controller传递event与data( $broadcast(name, args) ) $on用于接收event与data( $on(name, listener) ) <div ng-controller="ParentCtrl"> <!--父级--> <div ng-controller=

angular之$on、$emit、$broadcast

1.$scope.$on view事件 //View被加载但是DOM树构建之前时: $scope.$on('$viewContentLoading', function(event, viewConfig){ ... }); //View被加载而且DOM树构建完成时: $scope.$on('$viewContentLoaded', function(event){ ... }); //路由路径发生改变时 current:要到达的路径  previous:上一个路径 $scope.$on('$l

AngularJS笔记

1,客户模板 angular中,模板和数据都会被发送到浏览器中,然后在客户端进行装配 2,MVC (1)MVC核心概念,把管理数据的代码(model).应用逻辑代码(controller).向用户展示数据的代码 (view)清晰地分离开 (2)Angular应用中: 试图就是Document ObjectModel 控制器就是Javascript类 模型数据则被储存在对象属性中 3,数据绑定 (1)数据绑定可自动将model和view间的数据同步 (2)Angular实现数据绑定的方式,可以让我