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 相关文章推荐
js数组操作学习总结
Nov 04 Javascript
JavaScript随机生成信用卡卡号的方法
Apr 07 Javascript
JS截取与分割字符串常用技巧总结
Nov 10 Javascript
详解JavaScript中双等号引起的隐性类型转换
May 30 Javascript
关于动态执行代码(js的Eval)实例详解
Aug 15 Javascript
微信小程序 页面传参实例详解
Nov 16 Javascript
jquery+ajax实现省市区三级联动效果简单示例
Jan 04 Javascript
Node.js之网络通讯模块实现浅析
Apr 01 Javascript
使用jQuery卸载全部事件的思路详解
Apr 03 jQuery
AngularJS 前台分页实现的示例代码
Jun 07 Javascript
全面分析JavaScript 继承
May 30 Javascript
angular异步验证防抖踩坑实录
Dec 01 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执行批量mysql语句的解决方法
2013/05/02 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
laravel入门知识点整理
2020/09/15 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
javascript Object与Function使用
2010/01/11 Javascript
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
jquery实现表格中点击相应行变色功能效果【实例代码】
2016/05/09 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
python之DataFrame实现excel合并单元格
2021/02/22 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
Django框架封装外部函数示例
2019/05/28 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
pandas分批读取大数据集教程
2020/06/06 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
简单的Python人脸识别系统
2020/07/14 Python
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
介绍一下mysql的日期和时间函数
2013/03/28 面试题
高职教师岗位职责
2013/12/24 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
驳回起诉裁定书
2015/05/19 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
毕业生入职感言
2015/07/31 职场文书
2019销售早会主持词
2019/06/27 职场文书
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers