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 去前后空格大全(IE9亲测)
Jul 15 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
Nov 21 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
Apr 23 Javascript
jQuery中parents()和parent()的区别分析
Oct 28 Javascript
悬浮广告方法日常收集整理
Mar 18 Javascript
Node.js 日志处理模块log4js
Aug 28 Javascript
JavaScript中三种常见的排序方法
Feb 24 Javascript
微信小程序实现多个按钮toggle功能的实例
Jun 13 Javascript
详解Vue 2.0封装axios笔记
Jun 22 Javascript
vue技术分享之你可能不知道的7个秘密
Apr 09 Javascript
vue axios整合使用全攻略
May 24 Javascript
Vue商品控件与购物车联动效果的实例代码
Jul 21 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 什么是PEAR?
2009/03/19 PHP
php中使用explode查找某个字符是否存在的方法
2011/07/12 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
ThinkPHP3.2.2的插件控制器功能简述
2014/07/09 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
layui实现动态和静态分页
2018/04/28 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
2020/07/17 Javascript
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
python三引号如何输入
2020/07/06 Python
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
澳大利亚设计的婴儿和女孩的衣服:Oobi
2018/12/16 全球购物
linux下进程间通信的方式
2013/01/23 面试题
商务英语应届生自我鉴定
2013/12/08 职场文书
公司管理建议书范文
2014/03/12 职场文书
服装采购员岗位职责
2014/03/15 职场文书
表彰大会策划方案
2014/05/13 职场文书
节能环保口号
2014/06/12 职场文书
白莲教口号
2014/06/18 职场文书
2014年招生工作总结
2014/11/26 职场文书
百年校庆感言
2015/08/01 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
Java基础之this关键字的使用
2021/06/30 Java/Android