理解Angular 服务
什么是Angular Service
Angular 服务是为web应用执行特定任务的单例对象或方法。 注:如果组件是为了内容呈现的功能复用,那么服务就是为组件进行功能复用。
Angular有一些内建的服务(例如:$http),也可以创建自己的服务。内建的服务通常使用“$”开头(与jQuery类似)。
使用Angular 服务
在使用Angular服务的时候,只要将其注册成为Angular组件的一个依赖项目就可以了。Angular会自动对这个服务进行实例化、信赖处理等。
Angular使用“constructor”(构造器)进行信赖注入。信赖将会传递给组件的工厂或构造器方法。因为JavaScript是一个动态类型的语言,Angular的信赖注入子系统不能使用静态的类型来识别服务的信赖。因此,一个组件必须明确的通过使用一种“注释”注入方法来定义它的信赖。例如,使用$inject属性:
var MyController = function($location) { ... };
MyController.$inject = ['$location'];
myModule.controller('MyController', MyController);
或者提供一个内联的注入“注释”:
var myService = function($http) { ... };
myModule.factory('myService', ['$http', myService]);
参考:
定义一个服务
应用开发人员通过在Angular模块中注册“名字”与“服务工厂”来定义自己的服务。
服务的工厂方法的目的是用来生成单例对象(或者方法function)。生成的对象或者方法可以通过指定到这个服务的信赖来被注入到任意的组件当中。
Angular工厂方法使用消极执行策略,这意味着,只有当需要处理一个依赖的时候,才会为每一个服务执行一次。所有的事项都是依赖于这个服务来获取一个被服务工厂方法生成的实例。
管理服务信赖
Angular允许服务声明其他的服务作为信赖需要,用来构造它们的实例。
为了声明依赖,你可以在工厂方法的参数中指定它们,然后通过使用$inject属性、字符串数组或数组注释以注入注释标明这个方法。
使用数组注释:
function myModuleCfgFn($provide) {
$provide.factory('myService', ['dep1', 'dep2', function(dep1, dep2) {}]);
}
使用$inject属性:
下面是两个服务的例子,其中一个依赖另一个,并且这两个服务都依赖Angular框架提供的其他服务:
注意:
- batchLog服务依赖于内建的$timeout和$log服务,并且允许消息输出到console.log日志文件中。
- routeTemplateMonitor服务依赖于内建的$route服务就像我们自定义的batchLog服务。
- 我们的两个服务都使用工厂方法来标识和数组注释来注入注释以声明它们的依赖。这里要注意的是,在数组中字符串的顺序要与在工厂方法的参数列表中的一致。除非依赖是从方法的参数列表中推断出来的,这个带有ID的数组和它们被注入的顺序决定各个服务被注入到哪里。
参考: