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 25 Javascript
封装了一个js图片轮换效果的函数
Sep 28 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
Apr 01 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
Apr 07 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
Jul 27 Javascript
jQuery动态添加
Apr 07 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
Nov 23 Javascript
基于Vue-cli快速搭建项目的完整步骤
Nov 03 Javascript
详解javascript设计模式三:代理模式
Mar 25 Javascript
layui下拉列表select实现可输入查找的方法
Sep 28 Javascript
js实现自定义右键菜单
May 18 Javascript
js实现时间日期校验
May 26 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简单实现数组分页的方法
2016/04/30 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
js防止表单重复提交的两种方法
2013/09/30 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
DOM 事件的深入浅出(一)
2016/12/05 Javascript
javascript history对象详解
2017/02/09 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
Python素数检测实例分析
2015/06/15 Python
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
Django视图、传参和forms验证操作
2020/07/15 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
优秀教导主任事迹材料
2014/05/09 职场文书
保安公司服务承诺书
2014/05/28 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
执行力心得体会范文
2016/01/11 职场文书
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP