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 相关文章推荐
Hutia 的 JS 代码集
Oct 24 Javascript
jQuery解决iframe高度自适应代码
Dec 20 Javascript
JavaScript 原型链学习总结
Oct 29 Javascript
查询json的数据结构的8种方式简介
Mar 10 Javascript
javascript中expression的用法整理
May 13 Javascript
JavaScript中的apply和call函数详解
Jul 20 Javascript
Vue组件化通讯的实例代码
Jun 23 Javascript
ReactNative列表ListView的用法
Aug 02 Javascript
vue将后台数据时间戳转换成日期格式
Jul 31 Javascript
微信小程序新闻网站详情页实例代码
Jan 10 Javascript
前端vue+elementUI如何实现记住密码功能
Sep 20 Javascript
vue中三级导航的菜单权限控制
Mar 31 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数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
jQuery实现的导航条切换可显示隐藏
2014/10/22 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
JS实现的添加弹出层并完成锁屏操作示例
2017/04/07 Javascript
layui文件上传实现代码
2017/05/20 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
antd design table更改某行数据的样式操作
2020/10/31 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
Python线程同步的实现代码
2018/10/03 Python
浅谈Python的list中的选取范围
2018/11/12 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
英国巧克力贸易公司:Chocolate Trading Company
2017/03/21 全球购物
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
linux面试题参考答案(4)
2013/01/28 面试题
学年末自我鉴定
2014/01/21 职场文书
初中班主任评语大全
2014/04/24 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
Python3中最常用的5种线程锁实例总结
2021/07/07 Python
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL