`

AngularJS的学习--$on、$emit和$broadcast的使用

阅读更多

        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

  • 大小: 28 KB
  • 大小: 77.6 KB
分享到:
评论

相关推荐

    AngularJS $on、$emit和$broadcast的使用

    2. 使用$on、$emit和$broadcast方法:AngularJS通过事件系统提供了一种在作用域之间通信的方式,这种方法不需要手动管理服务。 - $emit方法用于从当前作用域向上冒泡事件到父作用域。当你在子作用域中调用$scope.$...

    Angularjs中的事件广播 —全面解析$broadcast,$emit,$on

    AngularJS提供了一些内置的服务和方法来实现事件的广播和监听,包括$broadcast、$emit和$on。本篇文章将全面解析这三个方法的用法和功能。 首先,我们来看$broadcast方法。$broadcast方法用于将事件从父级作用域向...

    解决angularjs service中依赖注入$scope报错的问题

    如果服务需要与控制器通信,可以使用回调函数、事件、$broadcast、$emit或$root SCOPE的方式来进行。 例如,如果服务需要更新页面上的某个状态,它可以通过返回一个函数,该函数被控制器调用时执行相应的逻辑,或者...

    angularjs笔试题

    - **Events**: 利用 `$broadcast`, `$emit`, `$on` 等方法来发送和接收事件。 - **$rootScope**: 使用 `$rootScope` 来实现跨控制器的数据共享。 - **Controller**: 控制器之间可以直接使用 `$parent` 或 `$...

    AngularJS-StyleGuide-IonicApp:Ionic 应用程序中的 AngularJS 风格指南

    另外,考虑使用`$rootScope.$on`和`$broadcast`/`$emit`进行事件通信的性能影响。 12. **持续集成与自动化** - 配置持续集成工具(如Jenkins或Travis CI)进行自动构建和测试。使用Gulp或Grunt进行任务自动化,如...

    AngularJS控制器之间的数据共享及通信详解

    - **无直接关联的控制器**:可以利用 `$rootScope` 使用 `$emit` 和 `$broadcast` 来传递数据。 - **父控制器到子控制器**:父控制器使用 `$scope.$broadcast()` 方法广播数据,子控制器通过 `$scope.$on()` 方法...

    AngularJS - Novice to Ninja.pdf.pdf )

    非常不错的书 Preface . . . . . . . . ....Who Should Read This Book ....Conventions Used ....Code Samples ....Tips, Notes, and Warnings ....Supplementary Materials ....$scope.$emit(name,args) For Emitting Events . ...

    AngularJS 0005:作用域

    `$emit`用于向父作用域发送事件,`$broadcast`用于向所有子作用域发送事件,`$on`用于注册事件监听器。 总的来说,AngularJS的作用域是数据模型和视图之间的重要连接,它提供了一种高效的数据绑定机制和事件通信...

    Angularjs的Controller间通信机制实例分析

    AngularJS提供了一种优雅的方式来处理Controller间的通信,主要依赖于Scope的事件机制,包括`$broadcast`、`$emit`和`$on`。 1. **事件机制**: - **$on**:这是AngularJS中的事件监听器,用于注册事件处理函数。...

    深入理解AngularJs-scope的脏检查(一)

    此外,scope还支持事件机制,包括`$on`、`$broadcast`和`$emit`: - `$on`:注册事件监听器,当特定事件触发时执行回调函数。 - `$broadcast`:从当前scope向下广播事件,事件会传递到所有的子scope。 - `$emit`:...

    angular中实现控制器之间传递参数的方式

    AngularJS提供了事件广播机制,允许控制器之间通过事件来传递数据,包括 `$on`、`$emit` 和 `$broadcast`。 - `$on`: 注册一个事件处理函数,当事件被当前作用域或其上级作用域触发时执行。 - `$emit`: 向当前...

    angularjs 1.X crm 后台管理系统

    7. **组件通信**:在组件之间传递数据,可以使用事件广播($emit、$broadcast、$on)或者服务共享数据。 总的来说,"angularjs 1.X crm 后台管理系统"资源为开发者提供了一个学习和实践AngularJS的实例,涵盖了前端...

    Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法

    `$emit`向上冒泡到父控制器,而`$broadcast`向下广播到子控制器。如果你需要在当前控制器中监听事件,可以使用`$on`直接注册事件监听器。 总的来说,通过自定义指令`repeatFinish`,我们可以监听到`ng-repeat`的...

    AngularJs学习第五篇从Controller控制器谈谈$scope作用域

    然而,过度依赖`$rootScope`进行数据通信可能会导致应用变得复杂和难以调试,因此,推荐使用服务(Service)或者`$broadcast`和`$emit`来进行跨控制器的数据共享,以保持应用的整洁和可维护性。

    AngularJS分页

    7. **自定义事件(Custom Events)**:为了使分页组件与其他组件通信,可以使用AngularJS的 `$emit`、`$broadcast` 和 `$on` 来发布和监听自定义事件。例如,当用户切换页面时,分页组件可以发出一个事件,通知其他...

    浅谈angularJS中的事件

    在AngularJS中,事件是应用状态改变的一种通知机制,它允许不同组件之间进行通信和协调。Angular事件系统并不直接与浏览器的DOM事件系统挂钩,而是提供了自己的事件监听和触发机制,使得开发者能够在Angular作用域...

    AngularJS Controller作用域.docx

    3. **事件广播与监听**:Controller可以通过 `$scope.$on()` 监听事件,而 `$scope.$emit()` 和 `$scope.$broadcast()` 可以用来在作用域树上向上或向下广播事件,实现不同Controller间的通信。 在JavaScript代码中...

    AngularJs实现聊天列表实时刷新功能

    除$broadcast()和$on()方法外,AngularJS中还可以使用$emit()和$watch()来实现类似的功能。$emit()是从子作用域向上冒泡事件到父作用域,而$watch()可以监视作用域中变量的变化并作出相应的响应。 AngularJS提供了...

Global site tag (gtag.js) - Google Analytics