原文链接:http://www.cnblogs.com/webbes…
AngularJS中的controller是个函数,用来向视图的作用域($scope)增加分外的功用,我们用它来给作用域对象设置初始状况,并增加自定义行动。
当我们在建立新的控制器时,angularJS会帮我们天生并通报一个新的$scope对象给这个controller,在angularJS运用的中的任何一个部份,都有父级作用域的存在,顶级就是ng-app地点的层级,它的父级作用域就是$rootScope。
每一个$scope的$root指向$rootScope, $cope.$parent指向父级作用域。
cotroller之间的通讯本质上是当前的controller地点的$scope怎样跟其他controller上的$scope举行通讯。
平常有3中处置惩罚体式格局:
应用作用域继续的道理,子控制器接见父级控制器中的内容。
运用angularJS中的事宜,也就是运用$on,$emit,$broadcast举行音讯通报
运用angularJS中的效劳
第一种体式格局
即作用域嵌套作用域,有肯定的运用限定,须要作用域嵌套起来,在现实开辟中这类场景相对比较少,但也不是没有,这类体式格局更简朴直接。
angularJS中默许情况下,当前作用域中没法找到某个属性时,就会在父级作用域中举行查找,若找不到直至查找到$rootScope。 假如在$rootScope中也没法找到顺序照旧运转,但视图不会更新。
示例
JavaScript
//Javascript
app.controller('ParentController', function($scope) {
$scope.person = {greeted: false};
});
app.controller('ChildController', function($scope) {
$scope.sayHello = function() {
$scope.person.name = 'Ari Lerner';
};
});
//HTML
<div ng-controller="ParentController">
<div ng-controller="ChildController">
<a ng-click="sayHello()">Say hello</a>
</div>
{{ person }}
</div>
//result
{"greeted":true, "name": "Ari Lerner"}
第二种体式格局
由于作用域是有条理的,所以可以应用作用域链通报事宜。
通报事宜有2种体式格局: $broadcast: 触发的事宜要关照全部事宜体系(许可恣意作用域处置惩罚这个事宜)就要向下流传。 $emit: 假如要提示一个全局模块,须要关照更高条理的作用域时(比方$rootscope)须要把事宜向上通报。
作用域上运用$on举行事宜监听。
示例
JavaScript
app.controller('ParentController', function($scope) {
$scope.$on('$fromSubControllerClick', function(e,data){
console.log(data); // hello
});
});
app.controller('ChildController', function($scope) {
$scope.sayHello = function() {
$scope.$emit('$fromSubControllerClick','hello');
};
});
//HTML
<div ng-controller="ParentController">
<div ng-controller="ChildController">
<a ng-click="sayHello()">Say hello</a>
</div>
</div>
在这里想要说的别的一个题目就是事宜流传的机能题目,$broadcast+$on的体式格局回关照一切的子作用域,这里就会有机能题目,所以引荐运用$emit+$on的体式格局,为了进一步提拔机能,定义的事宜处置惩罚函数要在作用域烧毁时一同释放掉。
运用$emit+$on的体式格局须要我们将事宜监听绑定在$rootScope上,比方:
JavaScript
angular
.module('MyApp')
.controller('MyController', ['$scope', '$rootScope', function MyController($scope, $rootScope) {
var unbind = $rootScope.$on('someComponent.someCrazyEvent', function(){
console.log('foo');
});
$scope.$on('$destroy', unbind);
}
]);
然则这类体式格局有点烦琐,定义多个事宜处置惩罚函数时全部人都不好了,所以我们来革新一下
应用装潢器来定义一个新的事宜绑定函数:
JavaScript
angular
.module('MyApp')
.config(['$provide', function($provide){
$provide.decorator('$rootScope', ['$delegate', function($delegate){
Object.defineProperty($delegate.constructor.prototype, '$onRootScope', {
value: function(name, listener){
var unsubscribe = $delegate.$on(name, listener);
this.$on('$destroy', unsubscribe);
return unsubscribe;
},
enumerable: false
});
return $delegate;
}]);
}]);
那末我们在控制器中定义事宜处置惩罚函数时:
JavaScript
angular
.module('MyApp')
.controller('MyController', ['$scope', function MyController($scope) {
$scope.$onRootScope('someComponent.someCrazyEvent', function(){
console.log('foo');
});
}
]);
第三种体式格局
应用angularJS中service单例形式的特征,效劳(service)供应了一种能在运用的全部生命周期内坚持数据的体式格局,可以在控制器之间举行通讯,且能保证数据的一致性。
平常我们都邑封装server来为运用供应接见数据的接口,或许跟长途举行数据交互。
示例
JavaScript
var myApp = angular.module("myApp", []);
myApp.factory('Data', function() {
return {
name: "Ting"
}
});
myApp.controller('FirstCtrl', function($scope, Data) {
$scope.data = Data;
$scope.setName = function() {
Data.name = "Jack";
}
});
myApp.controller('SecondCtrl', function($scope, Data) {
$scope.data = Data;
$scope.setName = function() {
Data.name = "Moby";
}
});
关于同级controller之间通讯我的一个发问:https://segmentfault.com/q/10…