AngularJS学习笔记之依赖注入

实习的时候用AngularJS比较多,写一篇学习笔记用来记录依赖注入的几种方式。
ng中的“依赖注入”是通过provider和injector实现的。

注入方式:

1、推断型注入:函数参数的名称必须要和被注入的对象相同

例子:

1
2
3
4
5
var myModule = angular.module('MyModule',[]);
var MyCtrl = function($scope){
$scope.name = 'hello world';
}
myModule.controller('MyCtrl',MyCtrl);

AngularJS根据函数的签名,从中找到函数参数的名称,当调用这个函数的时候把参数注入。
注意点:函数的参数名称必须要和被注入的对象相同。
当js压缩时会出错。

2、声明式注入:

例子:

1
2
3
4
5
6
var myModule = angular.module('MyModule',[]);
var MyCtrl = function(myName){
myName.name = 'hello world';
}
MyCtrl.$inject = ['$scope'];
myModule.controller('MyCtrl',MyCtrl);
3、内联式注入

例子:

1
2
3
4
var myModule = angular.module('MyModule',[]);
myModule.controller('MyCtrl',['$scope',function($scope){
$scope.name = 'hello world';
}])

推荐使用内联式注入,不用担心js代码压缩出问题。

其他几个例子:

例子:

1
2
3
4
5
6
7
8
9
10
11
var myModule = angular.module('MyModule',[]);
myModule.factory('game',function(){
return {
name: 'hello world';
}
});
myModule.controller('MyCtrl',['$scope','$injector',function($scope,$injector){
$injector.invoke(function(game){
console.log(game.name);
})
}])

在这个例子中MyCtrl依赖于服务person,但是它不声明依赖于person,而是通过注入器$injector来获得person的实例对象。通过注入器$injector的invoke方法,把服务person的实例注入到函数的funtion中。

在ng中,所有的provider都可以用来进行注入:
provider/factory/service/constant/value

以下类型的函数可以接受注入:
controller/directive/filter/service/factory等

provide的写法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var myModule = angular.module('MyModule',[]);
myModule.provider('HelloAngular',function(){
return {
$get: function(){
var name = 'hello world';
function getName(){
return name;
}
return{
getName: getName
}
}
}
});
myModule.controller('MyCtrl',['$scope','HelloAngular',
function($scope,helloAngular){
$scope.Name = helloAngular.getName();
}
])
factory的写法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var myModule = angular.module('MyModule',[]);
myModule.factory('HelloAngular',function(){
var name = 'hello world';
function getName(){
return name;
}
return {
getName:getName;
}
});
myModule.controller('MyCtrl',['$scope','HelloAngular',
function($scope,helloAngular){
$scope.Name = helloAngular.getName();
}
])
service的写法:
1
2
3
4
5
6
7
8
9
10
11
12
var myModule = angular.module('MyModule',[]);
myModule.service('HelloAngular',function(){
this.name = 'hello world';
this.getName = function(){
return this.name;
}
});
myModule.controller('MyCtrl',['$scope','HelloAngular',
function($scope,helloAngular){
$scope.Name = helloAngular.getName();
}
])

总结:provide是基础,其余都是调用provider函数实现的。从provide开始灵活性越来越差。