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


Posted in Javascript onSeptember 05, 2016

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

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

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

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

  1. $emit只能向parent controller传递event与data
  2. $broadcast只能向child controller传递event与data
  3. $on用于接收event与data

例子如下

html代码

<div ng-controller="ParentCtrl">        <!--父级-->
  <div ng-controller="SelfCtrl">       <!--自己-->
    <a ng-click="click()">click me</a>
    <div ng-controller="ChildCtrl"></div>  <!--子级-->
  </div>
  <div ng-controller="BroCtrl"></div>     <!--平级-->
</div>

js代码

app.controller('SelfCtrl', function($scope) {
  $scope.click = function () {
    $scope.$broadcast('to-child', 'child');
    $scope.$emit('to-parent', 'parent');
  }
});

app.controller('ParentCtrl', function($scope) {
  $scope.$on('to-parent', function(event,data) {
    console.log('ParentCtrl', data);    //父级能得到值
  });
  $scope.$on('to-child', function(event,data) {
    console.log('ParentCtrl', data);    //子级得不到值
  });
});

app.controller('ChildCtrl', function($scope){
  $scope.$on('to-child', function(event,data) {
    console.log('ChildCtrl', data);     //子级能得到值
  });
  $scope.$on('to-parent', function(event,data) {
    console.log('ChildCtrl', data);     //父级得不到值
  });
});

app.controller('BroCtrl', function($scope){ 
  $scope.$on('to-parent', function(event,data) { 
    console.log('BroCtrl', data);     //平级得不到值 
  }); 
  $scope.$on('to-child', function(event,data) { 
    console.log('BroCtrl', data);     //平级得不到值 
  }); 
});

最终结果

ParentCtrl parent

ChildCtrl child

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

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

 

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

感觉比service在不同controller中通信要方便许多~~

 以上就是对 AngularJS $on、$emit和$broadcast的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
jQuery与ExtJS之选择实例分析
Aug 19 Javascript
extjs 04_grid 单击事件新发现
Nov 27 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
Jan 15 Javascript
extjs表格文本启用选择复制功能具体实现
Oct 11 Javascript
js字符串转成JSON
Nov 07 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
Mar 05 Javascript
JavaScript学习笔记之定时器
Jan 22 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
Dec 19 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
Aug 14 jQuery
一个简单的node.js界面实现方法
Jun 01 Javascript
vue.js动画中的js钩子函数的实现
Jul 06 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
Sep 25 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
Sep 05 #Javascript
Vuejs第六篇之Vuejs与form元素实例解析
Sep 05 #Javascript
Vue表单实例代码
Sep 05 #Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
Sep 05 #Javascript
JS实现的手机端精简幻灯片效果
Sep 05 #Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
Sep 05 #Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
Sep 05 #Javascript
You might like
重量级动漫纷纷停播!唯独OVERLORD第四季正在英魂之刃继续更新
2020/05/06 日漫
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
js类 from qq
2006/11/13 Javascript
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
JavaScript实现下拉列表
2021/01/20 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
python如何查看系统网络流量的信息
2016/09/12 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
python ChainMap 合并字典的实现步骤
2019/06/11 Python
Python super()函数使用及多重继承
2020/05/06 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
P D PAOLA意大利官网:西班牙著名的珠宝首饰品牌
2019/09/24 全球购物
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
医务人员自我评价
2014/01/26 职场文书
个人委托书范本
2014/09/13 职场文书
走群众路线学习笔记
2014/11/06 职场文书
大学生团员个人总结
2015/02/14 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server