Page 137 - AngularJS权威教程
P. 137

14.2  使用服务    117


                                  // 因此我们需要调用data.data来获取原始数据                                        1
                                  $scope.events = data.data;
                             })
                      });
                  });                                                                                2
                      由于$http返回的是promise对象,可以通过.success()方法像直接调用$http一样
                  调用返回的对象。                                                                           3

                      和上面的例子一样,并不推荐在控制器中使用$watch,这里只是为了方便演示。在
                  实际生产中会将这个功能封装进一个指令,并在指令中设置$watch。                                                  4

                  在这个例子中,你可能会注意到在输入字段发生变化前,有一个延时。如果不延时,将导致                                           5
              输入字段中的任何一个键盘输入都会让终端对GitHub API进行调用,这显然不是我们希望的。
                  通过内置服务$timeout来介绍一下这个延时。同注入githubService一样,需要将$timeout                             6
              服务注入到控制器中:

                  app.controller('ServiceController', function($scope, $timeout, githubService) {    7
                  });

                      在自定义服务之前注入所有的AngularJS内置服务,这是约定俗成的规则。
                                                                                                     8
                  现在可以在控制器中使用$timeout服务了。在这个例子中$timeout服务会取消所有网络请
              求,并在输入字段的两次变化之间延时350 ms。换句话说,如果用户两次输入之间有350 ms的间                                       9
              隔,就推断用户已经完成了输入,然后开始向GitHub发送请求:

                  app.controller('ServiceController', function($scope, $timeout, githubService) {    10
                          // 和上面的示例一样, 添加了$timeout服务
                          var timeout;
                          $scope.$watch('username', function(newUserName) {
                              if (newUserName) {                                                     11
                                  // 如果在进度中有一个超时(timeout)
                                  if (timeout) $timeout.cancel(timeout);
                                  timeout = $timeout(function() {                                    12
                                      githubService.events(newUserName)
                                          .success(function(data, status) {
                                              $scope.events = data.data;
                                          });                                                        13
                                  }, 350);
                              }
                          });                                                                        14
                      });
                  到现在为止,我们只介绍了服务如何将类似的功能打包在一起,而使用服务也是在控制器之
              间共享数据的典型方法。                                                                            15
                  例如,如果我们的应用需要后端服务的授权,可以创建一个SessionsService服务处理用户
                                                                                                     16
              的授权过程,并保存服务端返回的令牌。当应用中任何地方要发送一个需要授权的请求,可以通
              过SessionsService来访问令牌。
                                                                                                     17
                  如果我们的应用中有一个用来设置GitHub用户名的设置页面,我们希望在应用中所有的控制
              器之间共享用户名。
                                                                                                     18
   132   133   134   135   136   137   138   139   140   141   142