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代码
Oct 30 Javascript
12款经典的白富美型—jquery图片轮播插件—前端开发必备
Jan 08 Javascript
浅谈JavaScript 框架分类
Nov 10 Javascript
js实现简单鼠标跟随效果的方法
Apr 10 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
Jan 22 Javascript
AngularJS 避繁就简的路由
Jul 01 Javascript
深入理解react-router@4.0 使用和源码解析
May 23 Javascript
AngularJS中使用three.js的实例详解
Jul 21 Javascript
分析javascript原型及原型链
Mar 18 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
Aug 25 Javascript
JS设置自定义快捷键并实现图片上下左右移动
Oct 17 Javascript
如何在JavaScript中正确处理变量
Dec 25 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
PHP4实际应用经验篇(6)
2006/10/09 PHP
PHP教程 预定义变量
2009/10/23 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
调试php程序的简单步骤
2019/10/04 PHP
基于jQuery的倒计时插件代码
2011/05/07 Javascript
document.documentElement和document.body区别介绍
2013/09/16 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
JavaScript正则表达式简单实用实例
2017/06/23 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
Angular4 中内置指令的基本用法
2017/07/31 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python中使用动态变量名的方法
2014/05/06 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
实例详解Python装饰器与闭包
2019/07/29 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
原料仓管员岗位职责
2014/04/12 职场文书
2014超市收银员工作总结
2014/11/13 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python