为什么要使用服务
当需要向各种模块提供通用
功能时使用服务。
例如,我们可能具有可以在各个模块之间重用的数据库功能。因此,您可以创建一个具有数据库功能的服务。
什么是服务
AngularJS 中的服务是一个函数或对象。
AngularJS 中你可以创建自己的服务,或使用内建服务。
注意:与其他核心AngularJS标识符一样,内置服务始终以
$
(例如$http
)开头。
使用服务
<div ng-app='myApp' ng-controller='getUrlCtrl'>
<h3>{{myUrl}}</h3>
</div>
<script>
var app = angular.module('myApp', [])
app.controller('getUrlCtrl', [
'$scope',
'$location',
function ($scope, $location) {
$scope.myUrl = $location.absUrl();
}
])
</script>
上面的实例,使用了$location
服务获取当前页面的url
创建自己的Services
在AngularJS中,内置的服务都是以$
开头,所以我们的自定义服务尽量避免以$
开头。自定义服务的方式有如下几种:
- 使用Module的provider方法
- 使用Module的factory方法
- 使用Module的service方法
使用factory方法
通过factory方法创建的服务必须有返回值,即必须有return函数,它可以返回任意类型的值,包括基本数据类型或者对象类型。
如果没有return函数,则会报错。
factory注入的结果就是return返回的结果,可以在被注入的对象中使用注入的结果定义的各种方法.
定义
app.factory('UtilFactoryService', function () {
var factory = {};
factory.getTestString = function () {
return 'Hello Services'
}
return factory
})
调用,需要注入定义的services 名字UtilFactoryService
var app = angular.module('myApp', [])
app.controller('getUrlCtrl', [
'$scope',
'UtilFactoryService',
function ($scope, UtilFactoryService) {
$scope.hello = UtilFactoryService.getTestString();
}
])
使用service方法
1、有返回值写法,与factory方法相似
app.service('TestService', function () {
var TestService = {};
TestService.getTestString = function () {
return 'Hello Services'
}
return TestService
})
2、无返回值写法,需要加this
调用
app.service('TestService', function () {
this.getTestString = function () {
return 'Hello Services'
}
})
使用provide方法
app.provider('myProvider', function () {
this.artist = '';
this.thingFromConfig = '';
this.$get = function () {
var that = this;
return {
getArtist: function () {
return that.artist;
},
getThingFromConfig: function () {
return that.thingFromConfig;
}
}
};
});
app.config(function (myProviderProvider) {
myProviderProvider.thingFromConfig = 'hello service';
});
使用provide
方法创建服务有以下几个注意点
- 必须使用
$get
方法,provide注入的结果就是get方法返回的结果,如果不包含$get方法,则程序会报错。 - 在三种创建服务的方法中,只有使用provider方法创建的服务才可以传进config函数,以用于在对象启用之前,对模块进行配置。但是在config中进行配置的只能是在$get函数之外定义的变量,在下面定义的provider中只有artist与thingFromConfig两个变量可以被访问到,而getArtist与getThingFromConfig两个方法是不能被在config函数中访问到的。
- 而且在注入config函数中时,
参数名必须由服务名+Provider组成
,例如下面的例子注入到config函数中的就是myProviderProvider
三种方法的比较
- 需要在config中进行全局配置的话,只能选择provider方法
- factory和service是使用比较频繁的创建服务的方法。他们之间的唯一区别是:service方法用于注入的结果通常是new出来的对象,factory方法注入的结果通常是一系列的functions
- provider是创建服务最为复杂的方法,除非你需要创建一个可以复用的代码段并且需要进行全局配置,才需要使用provider创建
- 所有具有特定性目的的对象都是通过factory方法去创建