AngularJS中的作用域有一个非常有层次和嵌套分明的结构。其中它们都有一个主要的$rootScope(也就说对应的Angular应用或者ng-app),然后其他所有的作用域部分都是继承自这个$rootScope的,或者说都是嵌套在主作用域下面的。很多时候,你会发现这些作用域不会共享变量或者说都不会从另一个原型继承什么。
那么在这种情况下,如何在作用域之间通信呢?其中一个选择就是在应用程序作用域之中创建一个单例服务,然后通过这个服务处理所有子作用域的通信。
在AngularJS中还有另外一个选择:通过作用域中的事件处理通信。但是这种方法有一些限制;例如,你并不能广泛的将事件传播到所有监控的作用域中。你必须选择是否与父级作用域或者子作用域通信。
$on、$emit和$broadcast使得event、data在controller之间的传递变的简单。
1.$emit只能向parent controller传递event与data
2.$broadcast只能向child controller传递event与data
3.$on用于接收event与data
实例如下:
<!DOCTYPE html> <html ng-app="ngApp"> <head> <meta charset="utf-8" /> <title>AngularJS的学习--$on、$emit和$broadcast的使用</title> <script type="text/javascript" src="lib/jquery-1.8.3.js"></script> <script type="text/javascript" src="lib/angular.js"></script> </head> <body> <div ng-controller="ParentCtrl"> <!--父级--> <div ng-controller="SelfCtrl"> <!--自己--> <a ng-click="click()">click me</a> <div ng-controller="ChildCtrl"></div> <!--子级--> </div> <div ng-controller="BroCtrl"></div> <!--平级--> </div> <script type="text/javascript" charset="utf-8"> var app = angular.module("ngApp", []); app.controller('SelfCtrl', function($scope) { $scope.click = function () { $scope.$broadcast('to-child', 'child'); $scope.$emit('to-parent', 'parent'); } }); app.controller('ParentCtrl', function($scope) { $scope.$on('to-parent', function(event,data) { console.log('ParentCtrl', data); //父级能得到值 }); $scope.$on('to-child', function(event,data) { console.log('ParentCtrl', data); //子级得不到值 }); }); app.controller('ChildCtrl', function($scope){ $scope.$on('to-child', function(event,data) { console.log('ChildCtrl', data); //子级能得到值 }); $scope.$on('to-parent', function(event,data) { console.log('ChildCtrl', data); //父级得不到值 }); }); app.controller('BroCtrl', function($scope){ $scope.$on('to-parent', function(event,data) { console.log('BroCtrl', data); //平级得不到值 }); $scope.$on('to-child', function(event,data) { console.log('BroCtrl', data); //平级得不到值 }); }); //angular.bootstrap(document.documentElement); </script> </body> </html>
运行结果:
$emit和$broadcast可以传多个参数,$on也可以接收多个参数。在$on的方法中的event事件参数,其对象的属性和方法如下:
感觉广播比service在不同controller中通信要方便许多,但在实际的项目开发过程中,为了代码维护性,最好还是少用。
文章来源:http://www.cnblogs.com/CraryPrimitiveMan/p/3679552.html
相关推荐
本文主要介绍AngularJS $on、$emit和$broadcast的使用,这里整理了详细的资料及简单示例代码有兴趣的小伙伴可以参考下
angularjs 共享服务$shared 服务避免直接使用 $rootScope基本用法获取/设置 $shared . set ( 'someKey' , 'hello!' )$shared . get ( 'someKey' ) 手表 $shared . watch ( 'someKey' , function ( newVal ) { alert ...
Angularjs中不同作用域之间可以通过组合使用$broadcast,$emit,$on的事件广播机制来进行通信 介绍: $broadcast的作用是将事件从父级作用域传播至子级作用域,包括自己。格式如下:$broadcast(eventName,args) $emit的...
$emit和$on可以实现组件之间的传值,我们知道父组件传值给子组件使用props,但是不允许子组件传值给父组件,这时候使用这个就可以实现了。 注意:$emit和$on的事件必须在一个公共的实例上,才能够触发。 例子:我要...
面试官-Vue.js 中的 $emit 和 $on 方法有什么区别?.pdf
主要介绍了vue中$refs, $emit, $on, $once, $off的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
$emit与emit与emit与 $on的用法 新建bus.js import Vue from ‘vue’ export const bus = new Vue() 引用bus.js import {bus} from './bus' bus.$on('test', function (msg) { console.log(msg) }) bus.$emit('...
要在控制器之间传递变量变化需要使用angular中的$broadcast和$emit方法来传递,同时使用$on来接收事件并作出响应。 broadcast译为广播,即上级传递下级。 示例代码: [removed][removed] [removed] angular....
Vue中的父子通信使用$emit和$on是如何实现的简易代码$on (trigger, callback) {if (typeof callback === '
今天小编就为大家分享一篇解决Vue.js父组件$on无法监听子组件$emit触发事件的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
vue1.0中 vm.$dispatch 和 vm.$broadcast 被弃用,改用$emit,$on vm.$on( event, callback ) 监听当前实例上的自定义事件。事件可以由vm.$emit触发。回调函数会接收所有传入事件触发函数的额外参数。 vm.$emit( ...
组件之间事件触发 之前使用组件,并不是很频繁,是水平...父子组件之间事件触发可以使用$emit $emit的使用方法如下: 在子组件中,写一个click点击事件。比如: cancelCU() { this.dialogVisible = false; this.$emi
本文主要对vue 用$emit 与 $on 来进行组件之间的数据传输。重点给大家介绍vue中的$emit 与$on父子组件与兄弟组件的之间通信方式,感兴趣的朋友一起看看
vue-module-loader 分支支持 Vue3,并已进入候选测试阶段,欢迎验证。 vue-module-loader 是一个 Vue 插件,让你使用类似于的架构开发 Vue 应用。...// 安装使用,配置项中router实例和store实例必传。 Vue.
非常不错的书 Preface . . . . . . . . ....Who Should Read This Book ....Conventions Used ....Code Samples ....Tips, Notes, and Warnings ....Supplementary Materials ....$scope.$emit(name,args) For Emitting Events . ...