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 相关文章推荐
js限制textarea每行输入字符串长度的代码
Oct 31 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
Apr 07 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
Oct 17 Javascript
node.js中的fs.readdir方法使用说明
Dec 17 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
May 10 Javascript
使用node.js中的Buffer类处理二进制数据的方法
Nov 26 Javascript
微信小程序 实战实例开发流程详细介绍
Jan 05 Javascript
bootstrap选项卡使用方法解析
Jan 11 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
Apr 25 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
Oct 16 Javascript
D3.js实现简洁实用的动态仪表盘的示例
Apr 04 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
May 28 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
第三节--定义一个类
2006/11/16 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
PHP支付宝当面付2.0代码
2018/12/21 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
关于Python中浮点数精度处理的技巧总结
2017/08/10 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
Python如何实现爬取B站视频
2020/05/20 Python
CSS3实现圆角、阴影、透明效果并兼容各大浏览器
2014/08/08 HTML / CSS
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
应届生法律顾问求职信
2013/11/19 职场文书
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
拙作再改《我的收音机情缘》
2022/04/05 无线电