0%

angularJS服务

控制器只会在需要的时候被实例化,不用时被销毁,意味着每次重新加载时,当前的数据都会被angularjs清除掉。服务提供了在整个应用生命周期内保持数据的方法,它能够在控制器之间进行通信,并保持数据的一致性。

服务是单例对象

服务是一个单例对象,并且是延迟加载,在需要的时候被创建,并提供了把特定功能相关联的方法集中在一起的接口。当我们的应用加载服务时,服务会被执行并且返回一个单例的服务对象,它会存在于应用的整个生命周期内。

服务的创建

服务的工厂函数既可以是一个函数也可以是一个数组

1
2
3
4
5
// 用service创建服务
myApp.service('Session', function(){});
// 用factory创建服务
myApp.factory('api', ['apiUntil', function(apiUntil){}}]
);

五种创建服务的方法:

  • factory()
  • service()
  • constant()
  • value()
  • provider()

factory()方法

factory方法是创建服务的最快捷的方式,factory接受两个参数:

  • name(字符串)需要注册的服务名称
  • getFun(函数)服务的主体,在服务实例时被调用
1
2
3
4
5
6
7
8
9
myApp.factory('api', ['apiUntil', function(apiUntil){
return {
login: function(params){
return apiUntil.post(apiUrl + '/account.php/login/login', params);
}
};
}]);
// 在控制器中使用,其实就是发了post请求了。
api.login(params);

getFun函数可以返回任意类型的数据。

service()方法

service方法可以注册一个支持构造函数的服务,允许为服务对象注册一个构造函数,接受两个参数:

  • name(字符串)需要注册的服务名称
  • constructor(函数)构造函数,实例化服务对象
1
2
3
4
ver Person = function(name){
this.getName = function(){return name};
};
myApp.service('Session', Person);

也可以用这种方式注册:

1
2
3
4
5
6
7
8
9
10
11
myApp.service('Session', function(){
this.create = function(sessionId){
this.id = sessionId;
};
this.destroy = function(){
this.id = null;
};
return this;
});
// 控制器中使用
Session.create('32');

provider()方法

所有服务工厂都是由$provide服务创建的,$provide服务负责在运行时初始化这些提供者。提供者是具有一个$get()方法的对象,$injuctor通过调用$get方法创建服务实例。$provide提供了数个不同的API用于创建服务,每个服务都有各自特殊的用途。
所有创建服务的方法都构建在provider方法之上,provider()方法负责在$providerCache中注册服务。从技术上讲,factory()方法就是provider()方法注册服务的简略形式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
myApp.factory('api', ['apiUntil', function(apiUntil){
return {
login: function(params){
return apiUntil.post(apiUrl + '/account.php/login/login', params);
}
};
}]);
// 等同于
myApp.provider('api', ['apiUntil', function(apiUntil){
this.$get = function() {
return {
login: function(params){
return apiUntil.post(apiUrl + '/account.php/login/login', params);
}
};
};
}]);
// 在控制器中使用,其实就是发了post请求了。
api.login(params);

注意:如果希望在config()函数中可以对服务进行配置,必须用provider()来定义服务。

constent() 方法

可以将一个已存在的变量注册为服务,并将其注入到应用的其他部分当中。
constant()函数接受两个参数:

  • name(字符串)主要注册的常量的名字

  • value(常量)需要注册的常量的值

1
myApp.constant('apiKey', 2334343);

注意:这个常量不能被装饰器拦截

value()方法

如果服务的$get方法返回的是一个常量,那就没必要定义一个包含复杂功能的完整服务,可以通过value()方法方便的注册服务。
value()方法接受两个参数:

  • name (字符串)需要注册的服务名
  • value 值

这个值作为可以注入的实例返回。

1
myApp.value('apiKey', 2334343);

注意:value()和constent()方法之间最主要的区别是,常量可以注入到配置函数中,而值不可以。

码字辛苦,打赏个咖啡☕️可好?💘