有以下5中方法注册一个AngularJS可以识别的Service
value和constant是两个极其简单的方法,只有少数情况下会使用。 service已经开始复杂了起来。而factory是我认为既简单又有足够灵活的度的方法。最后的provide是最复杂的方法,其他方法都是provide的特殊情况下的简化。
另外AngularJS中注册的Service都是单例的。
1.Constant
这是最简单的方法,只是注册了一个常量。在以后的程序中,主要注入了‘MAX_LEN’, 那么就可以使用
module.constant('MAX_LEN',10);
module.service('service1',['MAX_LEN',function(MAX_LEN){
console.log(MAX_LEN) //控制台会打印出 10.
}]);
2.Values
这个也比较简单,单纯注册一个类,这个类没有其他依赖
module.value('myservice',new MyService());
3.Service
module.service('myjob',['myservice',function(){
myservice.work();
}]);
4.Factories
这是比较灵活又不失简单的方法。 注册一个工厂方法给AngularJS。使用myjob时,AngularJS会调用这个工厂方法来生成我们需要的对象:就是最后return的对象(他可以是任意合法的javascript对象)。
下面的例子中返回的是一个带3个方法的对象。使用是直接用 myjob.push() , myjob.put(), myjob.get()...调用。
module.factory('myjob',['myservice',function(myservice){
...
return {
push:function(){},
put:function(){},
get:function(){},
.....
};
}]);
5.Providers.
上面所有方法其实都是provide的一个特例。provide仍然是注册一个工厂方法。这个工厂方法必须返回一个带有$get方法的对象。而$get方法其实也是一个工厂方法。它返回的就是我们需要的对象。下面的例子中myjob其实带有三个方法push,put,get, 我们可以在以后随意使用。但是可以看到还有一个 setMinLen方法,它与$get方法同级。如何调用就牵涉到module的生命周期了。
module.provide('myjob',function(){
var config={minLen:10};
return {
setMinLen:function(minLen){
config.minLen=minLen||config.minLen;
},
$get:function(myservice,MAX_LEN){
return {
push:function(){},
put:function(){
if(10<config.minLen)
...
},
get:function(){},
};
}
};
});
Modules 生命周期
AngularJS中module要起作用必须经过两个阶段
1. The configuration phase: 这个阶段收集所以经过provide注册的服务,并进行前期的配置。上面的setMinLen就可以在这个阶段调用。
2. The run phase: It is the phase where we can execute any post-instantiaation logic.这个阶段才有$scope的概念。
The configuration phase: 这是依赖的不是服务,而是服务的provider,所以方法参数都是服务名加Provider的后缀
module.config(function(myjobProvider){
myjobProvider.setMinLen(20);
});
The run phase:
module.run(function($rootScope){
$rootScope.appStarted=new Date();
});