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+jqmodal弹出窗口实现代码分明
Jun 14 Javascript
JS俄罗斯方块,包含完整的设计理念
Dec 11 Javascript
Three.js源码阅读笔记(光照部分)
Dec 27 Javascript
JavaScript通过join函数连接数组里所有元素的方法
Mar 20 Javascript
JS阻止事件冒泡行为和闭包的方法
Jun 16 Javascript
Javascript中判断一个值是否为undefined的方法详解
Sep 28 Javascript
微信小程序日历组件calendar详解及实例
Jun 08 Javascript
微信小程序Getuserinfo解决方案图解
Aug 24 Javascript
解决Vue中 父子传值 数据丢失问题
Aug 27 Javascript
layui输入框只允许输入中文且判断长度的例子
Sep 18 Javascript
JavaScript实现随机五位数验证码
Sep 27 Javascript
vue全局使用axios的操作
Sep 08 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 Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
PHP 如何利用phpexcel导入数据库
2013/08/24 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
使用nodeJs来安装less及编译less文件为css文件的方法
2017/11/20 NodeJs
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
python创建文件时去掉非法字符的方法
2018/10/31 Python
Python实现的矩阵转置与矩阵相乘运算示例
2019/03/26 Python
Python实现最大子序和的方法示例
2019/07/05 Python
python中栈的原理及实现方法示例
2019/11/27 Python
浅析Python 字符编码与文件处理
2020/09/24 Python
python 自动识别并连接串口的实现
2021/01/19 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
瑞典度假品牌:OAS
2019/05/28 全球购物
简述数组与指针的区别
2014/01/02 面试题
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
实习生自荐信范文分享
2013/11/27 职场文书
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
实习生求职自荐信
2014/02/07 职场文书
教室标语大全
2014/06/21 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS