Page 140 - AngularJS权威教程
P. 140

120  第 14 章  服务


             14.3.3  provider()

                 所有服务工厂都是由$provide服务创建的,$provide服务负责在运行时初始化这些提供者。
                 提供者是一个具有$get()方法的对象,$injector通过调用$get方法创建服务实例。
             $provider提供了数个不同的API用于创建服务,每个方法都有各自的特殊用途。

                 所有创建服务的方法都构建在provider方法之上。provider()方法负责在$providerCache
             中注册服务。

                 从技术上说,当我们假定传入的函数就是$get()时,factory()函数就是用provider()方法
             注册服务的简略形式。
                 下面两种方法的作用完全一样,并且会创建同一个服务。

                 angular.module('myApp')
                 .factory('myService', function() {
                     return {
                         'username': 'auser'
                     };
                 })
                 // 这与上面工厂的用法等价
                 .provider('myService', {
                     $get: function() {
                         return {
                             'username': 'auser'
                         };
                     }
                 });

                 是否可以一直使用.factory()方法来代替.provider()呢?
                 答案取决于是否需要用AngularJS的.config()函数来对.provider()方法返回的服务进行额
             外的扩展配置。同其他创建服务的方法不同,config()方法可以被注入特殊的参数。

                 比如我们希望在应用启动前配置githubService的URL:
                 // 使用`.provider`注册该服务
                 angular.module('myApp', [])
                 .provider('githubService', function($http) {
                     // 默认的,私有状态
                     var githubUrl = 'https://github.com'

                     setGithubUrl: function(url) {
                         // 通过.config改变默认属性
                         if (url) { githubUrl = url }
                     },
                     method: JSONP, // 如果需要,可以重写

                     $get: function($http) {
                         self = this;
                         return $http({ method: self.method, url: githubUrl + '/events'});
                     }
                 });

                 通过使用.provider()方法,可以在多个应用使用同一个服务时获得更强的扩展性,特别是
             在不同应用或开源社区之间共享服务时。
   135   136   137   138   139   140   141   142   143   144   145