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 相关文章推荐
div移动 输入框不能输入的问题
Nov 19 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
Jul 01 Javascript
js 得到文件后缀(通过正则实现)
Jul 08 Javascript
使用javascript实现监控视频播放并打印日志
Jan 05 Javascript
js实现Select列表内容自动滚动效果代码
Aug 20 Javascript
BootStrap selectpicker
Jun 20 Javascript
jquery uploadify如何取消已上传成功文件
Feb 08 Javascript
Vue.js如何优雅的进行form validation
Apr 07 Javascript
详解如何在vue项目中引入elementUI组件
Feb 11 Javascript
详解如何写出一个利于扩展的vue路由配置
May 16 Javascript
VUE路由动态加载实例代码讲解
Aug 26 Javascript
js实现九宫格抽奖
Mar 19 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数组对比函数,存在交集则返回真,否则返回假
2011/02/03 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
php简单防盗链实现方法
2015/07/29 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
javascript 控制 html元素 显示/隐藏实现代码
2009/09/01 Javascript
Jquery 扩展方法
2010/05/06 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
使用JSON作为函数的参数的优缺点
2016/10/27 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
python中nan与inf转为特定数字方法示例
2017/05/11 Python
python学习入门细节知识点
2018/03/29 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
详解python内置模块urllib
2020/09/09 Python
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
麦当劳辞职信范文
2014/01/18 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
劳资协议书范本
2014/04/23 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
优秀教师推荐材料
2014/12/16 职场文书
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android