控制器只会在需要的时候被实例化,不用时被销毁,意味着每次重新加载时,当前的数据都会被angularjs清除掉。服务提供了在整个应用生命周期内保持数据的方法,它能够在控制器之间进行通信,并保持数据的一致性。
服务是单例对象
服务是一个单例对象,并且是延迟加载,在需要的时候被创建,并提供了把特定功能相关联的方法集中在一起的接口。当我们的应用加载服务时,服务会被执行并且返回一个单例的服务对象,它会存在于应用的整个生命周期内。
服务的创建
服务的工厂函数既可以是一个函数也可以是一个数组
1 | // 用service创建服务 |
五种创建服务的方法:
- factory()
- service()
- constant()
- value()
- provider()
factory()方法
factory方法是创建服务的最快捷的方式,factory接受两个参数:
- name(字符串)需要注册的服务名称
- getFun(函数)服务的主体,在服务实例时被调用
1 | myApp.factory('api', ['apiUntil', function(apiUntil){ |
getFun函数可以返回任意类型的数据。
service()方法
service方法可以注册一个支持构造函数的服务,允许为服务对象注册一个构造函数,接受两个参数:
- name(字符串)需要注册的服务名称
- constructor(函数)构造函数,实例化服务对象
1 | ver Person = function(name){ |
也可以用这种方式注册:
1 | myApp.service('Session', function(){ |
provider()方法
所有服务工厂都是由$provide
服务创建的,$provide
服务负责在运行时初始化这些提供者。提供者是具有一个$get()
方法的对象,$injuctor
通过调用$get
方法创建服务实例。$provide
提供了数个不同的API用于创建服务,每个服务都有各自特殊的用途。
所有创建服务的方法都构建在provider
方法之上,provider()
方法负责在$providerCache
中注册服务。从技术上讲,factory()
方法就是provider()
方法注册服务的简略形式。
1 | myApp.factory('api', ['apiUntil', function(apiUntil){ |
注意:如果希望在config()函数中可以对服务进行配置,必须用provider()来定义服务。
constent() 方法
可以将一个已存在的变量注册为服务,并将其注入到应用的其他部分当中。
constant()函数接受两个参数:
name(字符串)主要注册的常量的名字
value(常量)需要注册的常量的值
1 | myApp.constant('apiKey', 2334343); |
注意:这个常量不能被装饰器拦截
value()方法
如果服务的$get
方法返回的是一个常量,那就没必要定义一个包含复杂功能的完整服务,可以通过value()
方法方便的注册服务。
value()方法接受两个参数:
- name (字符串)需要注册的服务名
- value 值
这个值作为可以注入的实例返回。
1 | myApp.value('apiKey', 2334343); |
注意:value()和constent()方法之间最主要的区别是,常量可以注入到配置函数中,而值不可以。