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
   130   131   132   133   134   135   136   137   138   139   140