[关闭]
@frank-shaw 2016-09-22T11:34:05.000000Z 字数 2061 阅读 2006

angularJS自定义依赖service

angular.js


简介

之前已经提到了angularJS中的依赖service,有很多内置的依赖service,同时我们也可以自定义依赖service。我们来看看怎么做。下文中我们将依赖service成为服务

服务提供了一种能够在应用的整个生命周期内保持数据的方法。
服务是一个单例对象,在每个应用中只能够被实例化一次,并且是延迟加载的(需要时才会被创建)。

在AngularJS中创建自己的服务是非常容易的:只需要注册这个服务就可以了。注册服务的方式有很多(下面的函数都可以成为服务工厂,即生产服务的函数):

factory()

factory()是服务的工厂函数,返回的是一个单例的对象或函数(即服务)。factory()函数接受两个参数:

factory()最为常用,看一个简单例子:

  1. angular.module("myApp-service",[])
  2. .factory("githubService",funciton(){
  3. var serviceInstance = {};
  4. return serviceInstance;
  5. });

如何调用呢?我们来看,很简单:

  1. angular.module("myApp",["myApp-service"])
  2. .controller("serviceController",function($http, githubService){
  3. $scope.events = githubService.serviceInstance;
  4. });

这样子就可以了。

值得注意的是:在自定义服务之前注入所有的AngularJS内置服务,这是约定俗成的规则。同时,时刻接的服务在应用的整个生命周期都是单例模式的。

provider()

首先介绍一下内置的$provide服务。所有服务工厂都是由$provide服务创建的,$provide服务负责在运行时初始化这些服务工厂。provider()实现的就是内置$provide的功能,而所有服务工厂都构建在provider()方法之上的,可以说factory()service()constant()value()都是provider()方法的简略形式。

provider()必须包含$get()方法。provider()方法有两个参数:

如果是函数,那么他会通过依赖注入被调用,并且负责通过`$get()`方法返回一个对象。
如果是数组,会被当成一个带有行内依赖注入声明的函数处理。数组的最后一个元素应该是函数,可以返回一个带有`$get()`方法的对象。
如果是对象,它应该带有`$get()`方法。

我们来看看factory()provider()创建同一个服务时候的写法区别:

  1. //factory方法
  2. angular.module("myapp")
  3. .factory("myservice", function(){
  4. return {
  5. "username": "frank"
  6. };
  7. });
  8. //provider方法
  9. angular.module("myapp")
  10. .provider("myservice", {
  11. $get : function(){
  12. return {
  13. "username": "frank"
  14. };
  15. }
  16. });

可以很显然看出来:factory()provider()的写法更加简单,所以它更为常用。那么什么时候建议使用provider()呢?答案是:当需要用AngularJS的.config()函数来对.provider()方法返回的服务进行额外的拓展配置的时候。比如我们希望在应用启动前配置githubService的URL。

  1. angular.module("myApp",[])
  2. .provider("githubServiceProvider",funciton(){
  3. var githubUrl = "https://github.com",
  4. setGithubUrl : function(url){
  5. if(url){ githubUrl = url};
  6. },
  7. $get : function($http){
  8. self = this;
  9. return $http({url : githubUrl + "/events"});
  10. }
  11. });

那么在.config()函数中,就可以使用

  1. angular.module("myApp",[])
  2. .config(function(githubServiceProvider){
  3. githubServiceProvider.setGithubUrl("git@github.com");
  4. });

这里就介绍这么多,剩余三个service()constant()value()都比较简单,一些特殊应用场景而已。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注