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 相关文章推荐
JQuery 图片延迟加载并等比缩放插件
Nov 09 Javascript
读jQuery之二(两种扩展)
Jun 11 Javascript
jQuery焦点图切换简易插件制作过程全纪录
Aug 27 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
Oct 20 Javascript
浅析Node.js 中 Stream API 的使用
Oct 23 Javascript
深入理解JavaScript 函数
Jun 06 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
Jul 01 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
Jul 09 Javascript
还不懂递归?读完这篇文章保证你会懂
Jul 29 Javascript
vue-model实现简易计算器
Aug 17 Javascript
如何区分vue中的v-show 与 v-if
Sep 08 Javascript
详细聊聊vue中组件的props属性
Nov 02 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
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
PHP求最大子序列和的算法实现
2011/06/24 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
Yii框架上传图片用法总结
2016/03/28 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
Javascript中的相等与不等运算
2010/04/25 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
JavaScript多图片上传案例
2015/09/28 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
2017/11/21 Javascript
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
Python端口扫描简单程序
2016/11/10 Python
关于python写入文件自动换行的问题
2018/06/23 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
基于python实现对文件进行切分行
2020/04/26 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
2014年居委会工作总结
2014/12/09 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
无违反计划生育证明格式
2015/06/24 职场文书
OpenCV-Python实现人脸美白算法的实例
2021/06/11 Python
Netty客户端接入流程NioSocketChannel创建解析
2022/03/25 Java/Android