一个对象通常有三种方式可以获得对其依赖的控制权:
-
- 全局变量进行引用;
依赖注入是通过第三种方式实现的。比如:
rush:js;">
function SomeClass(greeter) {
this.greeter = greeter;
}
SomeClass.prototype.greetName = function(name) {
this.greeter.greet(name);
};
SomeClass能够在运行时访问到内部的greeter,但它并不关心如何获得对greeter的引用。 为了获得对greeter实例的引用,SomeClass的创建者会负责构造其依赖关系并传递进去。
基于以上原因,AngularJS使用$injetor(注入器服务)来管理依赖关系的查询和实例化。 事实上,$injetor负责实例化AngularJS中所有的组件,包括应用的模块、指令和控制器等。
例如下面这段代码。这是一个简单的应用,声明了一个模块和一个控制器:
rush:js;">
angular.module('myApp',[])
.factory('greeter',function() {
return {
greet: function(msg) {alert(msg);}
}
})
.controller('MyController',function($scope,greeter) {
$scope.sayHello = function() {
greeter.greet("Hello!");
};
});
当AngularJS实例化这个模块时,会查找greeter并自然而然地把对它的引用传递进去:
rush:xhtml;">