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 相关文章推荐
vs2003 js文件编码问题的解决方法
Mar 20 Javascript
用JQuery调用Session的实现代码
Oct 29 Javascript
js实现的类似于asp数据字典的数据类型代码实例
Sep 03 Javascript
Linux下编译安装php libevent扩展实例
Feb 14 Javascript
jQuery实现获取table表格第一列值的方法
Mar 01 Javascript
微信小程序 页面传值详解
Mar 10 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
微信小程序自定义组件
Aug 16 Javascript
zTree节点文字过多的处理方法
Nov 24 Javascript
Angular使用Restful的增删改
Dec 28 Javascript
通过实例解析vuejs如何实现调试代码
Jul 16 Javascript
vue设置全局访问接口API地址操作
Aug 14 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
《PHP编程最快明白》第八讲:php启发和小结
2010/11/01 PHP
PHP中用hash实现的数组
2011/07/17 PHP
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
PHP调试函数和日志记录函数分享
2015/01/31 PHP
为你总结一些php系统类函数
2015/10/21 PHP
Smarty分页实现方法完整实例
2016/05/11 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
jquery图片切换插件
2015/03/16 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
Pandas读取MySQL数据到DataFrame的方法
2018/07/25 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
Python代码太长换行的实现
2019/07/05 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
2014年酒店前台工作总结
2014/11/14 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
python基础之错误和异常处理
2021/10/24 Python
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS