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 相关文章推荐
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
Mar 24 Javascript
百度 popup.js 完美修正版非常的不错 脚本之家推荐
Apr 17 Javascript
文件编码导致jquery失效的解决方法
Jun 26 Javascript
chrome下img加载对height()的影响示例探讨
May 26 Javascript
JavaScript表格常用操作方法汇总
Apr 15 Javascript
javascript 应用小技巧方法汇总
Jul 05 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
May 30 Javascript
微信小程序 实战程序简易新闻的制作
Jan 09 Javascript
微信小程序Flex布局用法深入浅出分析
Apr 25 Javascript
微信小程序如何使用canvas二维码保存至手机相册
Jul 15 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
Aug 03 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
Oct 02 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
php桌面中心(一) 创建数据库
2007/03/11 PHP
php的memcached客户端memcached
2011/06/14 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
php使用cookie显示用户上次访问网站日期的方法
2015/01/26 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
2017/11/20 PHP
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
javascript解三阶幻方(九宫格)
2015/04/22 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
JavaScript实现按键精灵的原理分析
2017/02/21 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
Django model反向关联名称的方法
2018/12/15 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
关于box-sizing的全面理解
2016/07/28 HTML / CSS
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
通过canvas转换颜色为RGBA格式及性能问题的解决
2019/11/22 HTML / CSS
应届毕业生专业个人求职自荐信格式
2013/11/20 职场文书
入团者的自我评价分享
2013/12/02 职场文书
仓库组长岗位职责
2014/01/29 职场文书
收银员的岗位职责范本
2014/02/04 职场文书
大学专科自荐信
2014/06/17 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
党性分析自查总结
2014/10/14 职场文书
教师业务学习材料
2014/12/16 职场文书
文言文辞职信
2015/02/28 职场文书
靠谱准确的求职信
2019/04/02 职场文书