Angular中$broadcast和$emit的使用方法详解


Posted in Javascript onMay 22, 2017

要在控制器之间传递变量变化需要使用angular中的$broadcast和$emit方法来传递,同时使用$on来接收事件并作出响应。

broadcast译为广播,即上级传递下级。

示例代码:

<script src="../angular.js"></script>
<script>
angular.module("app", [])
  .controller("child", function($scope) {
    $scope.$on("parentChange", function(e, m) {
      $scope.change = "changed";
      $scope.child = m;
    })
  })
  .controller("parent", function($scope) {
    $scope.$watch("parent", function(n, o) {
      if (n == o) {
        return;
      }
      $scope.$broadcast("parentChange", n)
    })
  })
</script>

<body>
  <div ng-controller="parent">
    Parent: {{parent}}
    <input type="text" ng-model="parent">

    <div ng-controller="child">
      {{change}} Child: {{child}}
    </div>
  </div>
</body>

上述代码使用$watch监听parent的值的变化,当发生变化时就会“广播”出parentChange事件并传递了参数(输入框的值),此时子元素作用域中使用了$scope.$on("parentChange, handler)" 来接收parentChange事件,然后接受输入框的值并赋值给子作用域中的child变量。 这样就完成了值的传递。

效果:

Angular中$broadcast和$emit的使用方法详解

emit译为发射,即下级传递上级。

示例代码:

<script src="../angular.js"></script>
<script>
angular.module("app", [])
  .controller("parent", function($scope) {
    $scope.$on("childChange", function(e, m) {
      $scope.change = "changed";
      $scope.parent = m
    })
  })
  .controller("child", function($scope) {
    $scope.$watch("child", function(n, o) {
      if (n == o) {
        return;
      }
      $scope.$emit("childChange", n)
    })
  })
</script>


<body ng-controller="parent">
  {{change}} Parent: {{parent}}
  <div ng-controller="child">
    Child: {{child}}
    <input type="text" ng-model="child">
  </div>
</body>

当子元素的child值发生变化时,会向上级发出childChange事件,此时父元素正在监听的$on(“childChange”)会做出响应,将传递的参数赋值给parent,整个流程与 broadcast类似。

效果:

Angular中$broadcast和$emit的使用方法详解

上述作用域均存在层级关系,如果对于同级的作用域该如何做呢?

我们可以使用服务来广播事件:

<script src="../angular.js"></script>
<script>
angular.module("app", [])
  .service("myServive", function($rootScope) {
    return {
      change: function(n) {
        $rootScope.$broadcast("valueChange", n);

      }
    }
  })
  .controller("bro1", function($scope, myServive) {
    $scope.$watch("value1", function(n) {
      myServive.change(n);
    })

    $scope.$on("valueChange", function(e, m) {
      console.log("value1");
      $scope.value1 = m;
    })
  })
  .controller("bro2", function($scope, myServive) {
    $scope.$watch("value2", function(n) {
      myServive.change(n);
    })

    $scope.$on("valueChange", function(e, m) {
      console.log("value2");
      $scope.value2 = m;
    })
  })
</script>


<body>
  <div ng-controller="bro1">
    <h3> value1:</h3>
    <input type="text" ng-model="value1">
  </div>
  <div ng-controller="bro2">
    <h3>value2:</h3>
    <input type="text" ng-model="value2">
  </div>
</body>

我们在服务中运用了$rootScope,所有的作用域都从属于它,基于这点,我们可以在根作用域中广播事件,$rootScope.$broadcast("valueChange", n);,当每个子作用域中的值发生变化时我们都会调用服务中的change 方法来广播这个事件,同时每个作用域又都在监听$on("valueChange") 事件并作出相应处理,这样就实现了子作用域中的值会传递给兄弟作用域了。

效果为:

Angular中$broadcast和$emit的使用方法详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ExtJs Excel导出并下载IIS服务器端遇到的问题
Sep 16 Javascript
ko knockoutjs动态属性绑定技巧应用
Nov 14 Javascript
JavaScript三元运算符的多种使用技巧
Apr 16 Javascript
Javascript实现基本运算器
Jul 15 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
Sep 05 jQuery
jQuery实现简单的下拉菜单导航功能示例
Dec 07 jQuery
vue2.0组件之间传值、通信的多种方式(干货)
Feb 10 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
Apr 17 jQuery
深入浅析Vue中的 computed 和 watch
Jun 06 Javascript
Vue动态路由缓存不相互影响的解决办法
Feb 19 Javascript
Angular6使用forRoot() 注册单一实例服务问题
Aug 27 Javascript
vue-router的hooks用法详解
Jun 08 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
May 22 #Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
May 22 #Javascript
JS实现上传图片实时预览功能
May 22 #Javascript
详解Angular 4.x NgIf 的用法
May 22 #Javascript
JS实现无缝循环marquee滚动效果
May 22 #Javascript
jQuery表单验证之密码确认
May 22 #jQuery
JavaScript实现QQ聊天消息展示和评论提交功能
May 22 #Javascript
You might like
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
jQuery grep()方法详解及实例代码
2016/10/30 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
Vue实现选择城市功能
2017/05/27 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
Python 操作文件的基本方法总结
2017/08/10 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
Python 列表的清空方式
2020/01/13 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
龟牌英国商店:Turtle Wax Brand Store UK
2019/07/02 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
求职信模版
2013/11/30 职场文书
物理专业本科生自荐信
2014/01/30 职场文书
大型会议接待方案
2014/03/01 职场文书
2014年妇联工作总结
2014/11/21 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
2016特色励志班级口号
2015/12/24 职场文书