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 相关文章推荐
Javascript中判断变量是数组还是对象(array还是object)
Aug 14 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
Nov 30 Javascript
js实现div拖动动画运行轨迹效果代码分享
Aug 27 Javascript
js变量提升深入理解
Sep 16 Javascript
jQuery 插件实现随机自由弹跳气泡样式
Jan 12 Javascript
JS排序之选择排序详解
Apr 08 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
May 24 Javascript
Angularjs上传图片实例详解
Aug 06 Javascript
AngularJS ui-router刷新子页面路由的方法
Jul 23 Javascript
vue+webpack中配置ESLint
Nov 07 Javascript
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
Jun 05 Javascript
vue @ ~ 相对路径 路径别名设置方式
Jun 05 Vue.js
详解从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
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
PHP gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
原生js实现简单的焦点图效果实例
2017/12/14 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
javascript this指向相关问题及改变方法
2020/11/19 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
python数组复制拷贝的实现方法
2015/06/09 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
pip安装tensorflow的坑的解决
2020/04/19 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
时尚圣经:The Fashion Bible
2019/03/03 全球购物
幼儿运动会邀请函
2014/01/17 职场文书
采购意向书范本
2014/03/31 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
优秀员工事迹材料
2014/12/20 职场文书
师德师风个人总结
2015/02/06 职场文书