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 isType() 类型判断代码
Feb 14 Javascript
javascipt基础内容--需要注意的细节
Apr 10 Javascript
JavaScript实现的简单拖拽效果
Jun 01 Javascript
JQuery实现的图文自动轮播效果插件
Jun 19 Javascript
简单的jQuery入门指引
Jul 28 Javascript
JQuery 设置checkbox值二次无效的解决方法
Jul 22 Javascript
js实现tab选项卡切换功能
Jan 13 Javascript
vue.js实现标签页切换效果
Jun 07 Javascript
Node.js中你不可不精的Stream(流)
Jun 08 Javascript
详解Vue-Router源码分析路由实现原理
May 15 Javascript
vue.js click点击事件获取当前元素对象的操作
Aug 07 Javascript
JavaScript控制台的更多功能
Apr 28 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 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
Jquery iframe内部出滚动条
2010/02/11 Javascript
IE无法设置短域名下Cookie
2010/09/23 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
2013/06/17 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
javascript正则表达式总结
2016/02/29 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
2017/02/24 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
javascript实现抢购倒计时程序
2019/08/26 Javascript
解决vuex刷新数据消失问题
2020/11/12 Javascript
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
Python打印斐波拉契数列实例
2015/07/07 Python
如何用python写一个简单的词法分析器
2018/12/18 Python
python 发送和接收ActiveMQ消息的实例
2019/01/30 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
使用python自动追踪你的快递(物流推送邮箱)
2020/03/17 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
Python中Selenium模块的使用详解
2020/10/09 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
经济管理专业毕业生推荐信
2013/11/11 职场文书
机械绘图员岗位职责
2013/11/19 职场文书
《生命的药方》教学反思
2014/04/08 职场文书
《池塘边的叫声》教学反思
2014/04/12 职场文书
局火灾防控工作方案
2014/05/25 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
店面出租协议书范本
2014/11/28 职场文书
《1942》观后感
2015/06/08 职场文书
python超详细实现完整学生成绩管理系统
2022/03/17 Python