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 新手学习常见问题解决方法
Apr 18 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
Sep 03 Javascript
判断iframe里的页面是否加载完成
Jun 06 Javascript
JavaScript不刷新实现浏览器的前进后退功能
Nov 05 Javascript
简介JavaScript中toTimeString()方法的使用
Jun 12 Javascript
微信公众号 客服接口的开发实例详解
Sep 28 Javascript
详解webpack+es6+angular1.x项目构建
May 02 Javascript
vue父组件向子组件动态传值的两种方法
Nov 11 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
Mar 06 Javascript
js中的this的指向问题详解
Aug 29 Javascript
Typescript的三种运行方式(小结)
Sep 18 Javascript
Vue通过配置WebSocket并实现群聊功能
Dec 31 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获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
浅谈在koa2中实现页面渲染的全局数据
2017/10/09 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
layer.js之回调销毁对话框的例子
2019/09/11 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
python实现2014火车票查询代码分享
2014/01/10 Python
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
django定期执行任务(实例讲解)
2017/11/03 Python
python实现坦克大战游戏 附详细注释
2020/03/27 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
如何卸载python插件
2020/07/08 Python
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
机电一体化求职信
2014/03/10 职场文书
司法助理专业自荐书
2014/06/13 职场文书
物理教育专业求职信
2014/06/25 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
师德标兵事迹材料
2014/12/19 职场文书
写给老师的保证书
2015/05/09 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
python获取带有返回值的多线程
2022/05/02 Python