在Angular中,依赖注入可谓无孔不入。通常在两种场景(函数)下会使用到依赖注入:

工厂方法定义的组件(components):如directive,factory,filter,provider,controller等。这些工厂函数需要注册到某个模块上。controller比较特殊,它虽然也是一种组件,但是特别之处是它与某个DOM元素关联,因此可以注入$scope service,而其他组件只能注入$rootScope service。

模块提供的run/config方法。

AngularJS 提供很好的依赖注入机制。constant,value,factory,service和provider5个核心组件用来作为依赖注入。

在Angular中,factory,service和value本质上都是一种provider,Angular会执行如下代码定义这些provider:


                    myApp.config(function($provide) { 
$provide.provider('sayHello', function() {
this.$get = function() {
return function(name) {
alert("Hello, cat " + name);
}; }; }); });

                    myApp.factory("sayHello", ...);  
                    myApp.service("sayHello", ...);  
                    myApp.value("Cat", ...);  
                

总结

所有的供应商都只被实例化一次,也就说他们都是单例的

除了constant,所有的供应商都可以被装饰器(decorator)装饰

value就是一个简单的可注入的值

service是一个可注入的构造器

factory是一个可注入的方法

decorator可以修改或封装其他的供应商,当然除了constant

provider是一个可配置的factory

Angular在加载模块时经过两个阶段:config和run。传入config函数的方法会在当前模块加载时执行;传入run函数的方法会在所有模块加载结束后执行。因此,在config阶段即可配置多个provider,但是在config阶段,只有provider可以注入,因此自定义的service无法注入到config中。这也好理解,因为config阶段是对service进行配置的而不是使用service本身。

语法: return[()[expression][]]; 可选项 expression 参数是要从函数返回的值。如果省略,则该函数不返回值。 用 return 语句来终止一个函数的执行,并返回 expression 的值。如果 expression 被省略, 或在函数内没有 return 语句被执行,则把值 undefined 赋给调用当前函数的表达式。