@frank-shaw
2016-09-22T11:34:05.000000Z
字数 2061
阅读 2006
angular.js
之前已经提到了angularJS中的依赖service,有很多内置的依赖service,同时我们也可以自定义依赖service。我们来看看怎么做。下文中我们将依赖service成为服务。
服务提供了一种能够在应用的整个生命周期内保持数据的方法。
服务是一个单例对象,在每个应用中只能够被实例化一次,并且是延迟加载的(需要时才会被创建)。
在AngularJS中创建自己的服务是非常容易的:只需要注册这个服务就可以了。注册服务的方式有很多(下面的函数都可以成为服务工厂,即生产服务的函数):
factory()
是服务的工厂函数,返回的是一个单例的对象或函数(即服务)。factory()
函数接受两个参数:
factory()
最为常用,看一个简单例子:
angular.module("myApp-service",[])
.factory("githubService",funciton(){
var serviceInstance = {};
return serviceInstance;
});
如何调用呢?我们来看,很简单:
angular.module("myApp",["myApp-service"])
.controller("serviceController",function($http, githubService){
$scope.events = githubService.serviceInstance;
});
这样子就可以了。
值得注意的是:在自定义服务之前注入所有的AngularJS内置服务,这是约定俗成的规则。同时,时刻接的服务在应用的整个生命周期都是单例模式的。
首先介绍一下内置的$provide
服务。所有服务工厂都是由$provide
服务创建的,$provide
服务负责在运行时初始化这些服务工厂。provider()
实现的就是内置$provide
的功能,而所有服务工厂都构建在provider()
方法之上的,可以说factory()
、 service()
、 constant()
、 value()
都是provider()
方法的简略形式。
provider()
必须包含$get()
方法。provider()
方法有两个参数:
如果是函数,那么他会通过依赖注入被调用,并且负责通过`$get()`方法返回一个对象。 如果是数组,会被当成一个带有行内依赖注入声明的函数处理。数组的最后一个元素应该是函数,可以返回一个带有`$get()`方法的对象。 如果是对象,它应该带有`$get()`方法。
我们来看看factory()
与provider()
创建同一个服务时候的写法区别:
//factory方法
angular.module("myapp")
.factory("myservice", function(){
return {
"username": "frank"
};
});
//provider方法
angular.module("myapp")
.provider("myservice", {
$get : function(){
return {
"username": "frank"
};
}
});
可以很显然看出来:factory()
比provider()
的写法更加简单,所以它更为常用。那么什么时候建议使用provider()
呢?答案是:当需要用AngularJS的.config()函数来对.provider()方法返回的服务进行额外的拓展配置的时候。比如我们希望在应用启动前配置githubService的URL。
angular.module("myApp",[])
.provider("githubServiceProvider",funciton(){
var githubUrl = "https://github.com",
setGithubUrl : function(url){
if(url){ githubUrl = url};
},
$get : function($http){
self = this;
return $http({url : githubUrl + "/events"});
}
});
那么在.config()函数中,就可以使用
angular.module("myApp",[])
.config(function(githubServiceProvider){
githubServiceProvider.setGithubUrl("git@github.com");
});
这里就介绍这么多,剩余三个service()
、 constant()
、 value()
都比较简单,一些特殊应用场景而已。