详解AngularJS服务

  1. 背景介绍
    什么是服务?
    Services are designed to be the glue between controllers, the minions of data, the slaves of functionality, the worker-bees of our application.

以上是Angular团队对于服务的定义,翻译过来就是说 services是被用来设计成controller之间的胶水,数据的走狗,方法的奴隶,它就是我们程序的工蜂!

  1. 知识剖析
    AngularJS内置服务
    AngularJS内置了很多服务,我们看一下常用的AngularJS的服务

服务 描述
$http 向服务器发送请求并接受响应数据
$location 获取路径及修改路径服务
$setTimeout 对应于原生setTimeout方法
$interval 对应于原生interval方法
更多的内置服务请读者自行百度

AngularJS 自定义服务
创建自定义服务的三种方式

factory()
service()
provider()
factory

factory()让我们通过返回一个包含service方法和数据的对象来定义一个service
实际上factory方式创建的服务,作用就是返回一个有属性有方法的对象,我们可以在controller或其他服务中调用这个对象的的方法和属性。

示例

//shareData是这个服务的名称
angular.module(‘app’).factory(‘shareData’, function () {
let service = {
setData: function (propertyName, value) {
this[propertyName] = value;
},
getData: function (propertyName) {
return this[propertyName];
}
}
return service;
});
1
2
3
4
5
6
7
8
9
10
11
12
service

service()方法创建服务的方法与factory类似,只是不需要返回一个对象,而是将属性与方法直接写在this内就OK了。

示例

angular.module(‘app’).service(‘serviceService’, function () {
this.name = ‘serviceService’;
this.method = function () {
console.log('this is ’ + this.name);
}
});
1
2
3
4
5
6
provider

如果我们需要在启用服务之间对这个服务进行参数配置(使用config()方法),那么这个服务必须用provider来创建。需要使用this.$get来返回一个对象,这个对象包含了服务的属性和方法。

示例

angular.module(‘app’).provider(‘providerService’, function () {
let name;
this.setName = function (newName) {
name = newName;
};
this.$get = function () {
return {
getName: function () {
console.log(myName is ${name});
return name;
}
}
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
3. 更多讨论(三个问题)
使用provider创建的服务如何对其进行配置?

使用config()方法,注意,在注入服务的时候服务的名称不是创建的服务名称,需要在服务名后面再加上’Provider’

示例

angular.module(‘app’).provider(‘providerService’, function () {
let name;
this.setName = function (newName) {
name = newName;
};
this.$get = function () {
return {
getName: function () {
console.log(myName is ${name});
return name;
}
}
}
});
//注意下面注入的服务的名称为providerServiceProvider 而不是 providerService
angular.module(‘app’).config(function (providerServiceProvider) {
providerServiceProvider.setName(‘newName’);
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
factory, service, provider创建服务的方式是通用的吗?

不是! factory和service创建的服务的方式类似,换句话说factory和service可以互相替代,但是provider创建的可配置的服务, service和 factory却无法创建,也就是说 factory和service 无法替代provider!

如何利用服务在controller 之间传递数据。

本文开头就讲了服务是controller 之间的胶水, 因为service 在angular中是单例的。每个服务都只有一个实例,它相当于就是一个中介,我们可以在两个控制器中都注入这个服务,然后通过这个服务来传递一些数据。

示例:
有如下结构的html

1 2 3 4 //现在创建一个服务用于放入和取出数据,注意这里不能使用this.propertyName的方式来设置和读取属性 angular.module('app').factory('shareData', function () { let service = { setData: function (propertyName, value) { this[propertyName] = value; }, getData: function (propertyName) { return this[propertyName]; } } return service; }); 1 2 3 4 5 6 7 8 9 10 11 12 angular.module('app', []).controller('mainCtrl', function (shareData, $scope) { $scope.name = 'data'; shareData.setData('name', $scope.name); }); 1 2 3 4 现在我们在mainCtrl这个控制器里面设置了属性,现在我们要在childCtrl里面去读取这个属性

angular.module(‘app’).controller(‘childCtrl’, function ($scope, shareData) {
s c o p e . n a m e = s h a r e D a t a . g e t D a t a ( ′ n a m e ′ ) ; c o n s o l e . l o g ( scope.name = shareData.getData('name'); console.log( scope.name=shareData.getData(name);console.log(scope.name); //data
})
1
2
3
4
我们可以正常读取到mainCtrl中设置的属性。 这就是所谓的controller之间的胶水。

  1. 参考文献
    AngularJS系统学习之Factory, Service, Provider

详解Angular中的自定义服务Service、Provider以及Factory

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值