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 相关文章推荐
在Linux上用forever实现Node.js项目自启动
Jul 09 Javascript
jQuery对象的selector属性用法实例
Dec 27 Javascript
Bootstrap项目实战之子栏目资讯内容
Apr 25 Javascript
第十章之巨幕页头缩略图与警告框组件
Apr 25 Javascript
jQuery自定义组件(导入组件)
Nov 08 Javascript
详解AngularJS中的表单验证(推荐)
Nov 17 Javascript
js实现PC端和移动端刮卡效果
Mar 27 Javascript
js实现音频控制进度条功能
Apr 01 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
Jul 04 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
Jul 18 jQuery
基于ES6 Array.of的用法(实例讲解)
Sep 05 Javascript
vue递归获取父元素的元素实例
Aug 07 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
zend api扩展的php对象的autoload工具
2011/04/18 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
js类型检查实现代码
2010/10/29 Javascript
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
JS获取字符串实际长度(包含汉字)的简单方法
2016/08/11 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
2019/04/26 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
Preload基础使用方法详解
2020/02/03 Javascript
Python如何生成树形图案
2018/01/03 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
python3中rank函数的用法
2019/11/27 Python
同程旅游英文网站:LY.com
2018/11/13 全球购物
艺术系大学生毕业个人自我评价
2013/09/19 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
分公司任命书
2014/06/06 职场文书
要账委托书范本
2014/09/15 职场文书
企业党员个人自我评价
2014/09/20 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
劳动保障事务所个人工作总结
2015/08/12 职场文书
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL