Page 135 - AngularJS权威教程
P. 135
14.1 注册一个服务 115
使用angular.module的factory API创建服务,是最常见也是最灵活的方式: 1
angular.module('myApp.services', [])
.factory('githubService', function() {
var serviceInstance = {}; 2
// 我们的第一个服务
return serviceInstance;
}); 3
尽管githubService没做什么有趣的事情,但现在它已经用githubService作为名字注册成
为这个AngularJS应用的一个服务了。 4
服务的工厂函数用来生成一个单例的对象或函数,这个对象或函数就是服务,它会存在于应
用的整个生命周期内。当我们的AngularJS应用加载服务时,这个函数会被执行并返回一个单例 5
的服务对象。
同创建控制器的方法一样,服务的工厂函数既可以是一个函数也可以是一个数组: 6
// 用方括号声明工厂
angular.module('myApp.services', []) 7
.factory('githubService', [function($http) { }]);
例如, githubService需要访问$http服务,所以我们将$http服务当作AngularJS应用的一个
依赖,并将它注入到工厂函数中。 8
angular.module('myApp.services', [])
.factory('githubService', function($http) { 9
// 我们的serviceInstance现在可以在函数定义中访问$http服务
var serviceInstance = {};
return serviceInstance; 10
});
现在,无论何处需要访问GitHub API都不需要通过$http来进行了,可以通过githubService
来代替,并让它处理所有复杂的业务逻辑和远程服务。 11
GitHub API提供了一个读取用户活动流的方法(活动流就是用户记录在GitHub中的最近的事
件列表)。在我们的服务中,可以创建一个访问这个API的方法,并将API的请求结果返回。 12
通过将方法设置为服务对象的一个属性来将其暴露给外部。
13
angular.module('myApp.services', [])
.factory('githubService', function($http) {
var githubUrl = 'https://api.github.com'; 14
var runUserRequest = function(username, path) {
// 从使用JSONP调用Github API的$http服务中返回promise 15
return $http({
method: 'JSONP',
url: githubUrl + '/users/' +
username + '/' + 16
path + '?callback=JSON_CALLBACK'
});
}; 17
// 返回带有一个events函数的服务对象
return {
events: function(username) {
return runUserRequest(username, 'events'); 18