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获取复选框被选中值的简单方法
Jul 04 Javascript
js中文逗号转英文实现
Feb 11 Javascript
Jquery实现自定义tooltip示例代码
Feb 12 Javascript
使用JQuery库提供的扩展功能实现自定义方法
Sep 09 Javascript
js实现屏幕自适应局部代码分享
Jan 30 Javascript
获取阴历(农历)和当前日期的js代码
Feb 15 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
Feb 21 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
JavaScript闭包和范围实例详解
Dec 19 Javascript
js图片上传的封装代码
Aug 01 Javascript
vue mint-ui tabbar变组件使用
May 04 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
Mar 20 jQuery
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
推荐php模板技术[转]
2007/01/04 PHP
在PHP中操作Excel实例代码
2010/04/29 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
jQuery get和post 方法传值注意事项
2009/11/03 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
Three.js源码阅读笔记(物体是如何组织的)
2012/12/27 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
2015/03/30 Javascript
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
微信小程序 底部导航栏目开发资料
2016/12/05 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
canvas绘制万花筒效果(代码分享)
2017/01/20 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
[02:29]大剑、皮鞭、女装,这届DOTA2勇士令状里都有
2020/07/17 DOTA
python 测试实现方法
2008/12/24 Python
10款最好的Web开发的 Python 框架
2015/03/18 Python
Python中List.index()方法的使用教程
2015/05/20 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
Python中Numpy mat的使用详解
2019/05/24 Python
对Python中class和instance以及self的用法详解
2019/06/26 Python
python下载库的步骤方法
2019/10/12 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
2021/02/01 Python
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
数据员岗位职责
2013/11/19 职场文书
给同事的道歉信
2014/01/11 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL