Angular中创建服务(Service) - rushz/notepad GitHub Wiki

创建服务(Service)

在Angular中如何创建自己的服务,并注入到Angular的依赖注入系统中。

服务有如下特点

  1. 服务是单例模式的,所有的服务都只会实例化一次
  2. 服务是延迟加载的,只有第一次用到的时候才会被实例化

Angular注册的服务和通过requirejs加载的模块的区别

  1. Angular注册的服务,可以通过依赖注入,注入其他服务作为本服务的依赖,requirejs不能。
  2. requirejs的模块没有延迟加载特性。

服务的注册方式

  1. 通过Module提供的provider、factory、service、value和constant注册服务。
  2. 通过$provider服务提供的相关函数,注册服务。
var myModule = angular.module('myModule', []);
myModule.factory('serviceId', function() {
  return serviceInstance;
});
angular.module('myModule', [], function($provide) {
  $provide.factory('serviceId', function() {
    return serviceInstance;
  });
});

provider、factory、service、value和constant的区别

除了constant,本质上,其它四种注册方便最终都是调用provider完成服务的组成。 定义这么多的方法,主要是为了简化不同形式的服务的注册。 constant注册的服务,是常量,并且可以注入模块的config阶段,其它方式注册的不能。

  1. value: 注册一个变量,或者已经实例化的对象。
  2. service:注册实例的构造函数,系统自动调用该构造函数初始化服务对象。
  3. factory:注册一个函数,系统自动调用该函数,函数的返回值作为服务对象。
  4. provider:注册一个对象,该对象必须保护$get方法,系统自动调用$get方法,方法的返回值作为服务对象。

一下一种注册形式注册的服务,是等价的。

fuction Service(){}
$provide.provider('myService', {
    $get: function() {
      return new Service();
    }
});
$provide.factory('myService', function(){
    return new Service();
});
$provide.service('myService', Service);
$provide.value('myService', new Service());

decorator方法

decorator方法用于装饰服务对象,可以对服务对象装饰,或修改后,再返回。

$provide.decorator('myService2', function(myService) {
    myService.name = "decorator";
    return myService;
});