1. 程式人生 > >AngularJS $on、$emit和$broadcast簡單功能例項

AngularJS $on、$emit和$broadcast簡單功能例項

   
     我們知道,AngularJS的作用域是類似於JavaScript的原型繼承的原理,作用於之間有一定的層次關係。AngularJS的每個作用域都有一個$rootScope的根作用域,其他的作用域

繼承於這個作用域。但是很多作用域之間沒有繼承關係。在這種情況下,我們無法進行作用域之間的通訊。解決這個問題

     方法之一:在應用程式作用域中建立一個單例服務,用來解決所有子作用域之間的通訊。

     方法之二:通過AngularJS中的事件解決作用域之間的通訊。即:

           $emit:廣播給父controller

           $broadcast:廣播給子controller

           $on:有兩個引數function(event,data),第一個引數是事件物件,第二個是接收到的訊息。

           $emit、$broadcast的侷限在於他們只能分別向父controller和子controller傳播。

例子:

html程式碼:

<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>
js程式碼:

var myModule = angular.module('MyModule',[]);
myModule.controller('SelfCtrl', function($scope) {
	$scope.click = function() {
		$scope.$broadcast('to-child', '我是來自$broadcast');
		$scope.$emit('to-parent', '我是來自$emit');
	}
});

myModule.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); // 子級得不到值
	});
});

myModule.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); // 父級得不到值
	});
});

myModule.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); // 平級得不到值
	});
});
結果:

ChildCtrl 我是來自$broadcast ParentCtrl 我是來自$emit
本文來自:( http://www.it165.net/pro/html/201404/12610.html