AngularJS 核心:$Provide
$provide
负责给Angular
创造一个可注入的东西:即服务。
服务会被叫做供应商的东西来定义,就是使用$provide
来创建一个供应商。
你需要使用$provide
中的provider()
方法来定义一个供应商,同时你也可以通过$provide
注入到一个应用的config
函数中来获得$provide
服务。
定义供应商的方法们
AngularJS
用$provide
去定义一个供应商,这个$provide
有5个可用创建方法:
-
constant
定义常量用,定义的值不能被改变,它可以被注入到任何地方,但是不能被装饰器
decorator
装饰var app = angular.module('app', []); // 方式一 app.config(function ($provide) { $provide.constant('me', 'is constant'); }); // 方式二 app.constant('me', 'is constant');
-
value
可以是
string
,number
甚至function
,它和constant
的不同之处在于,它可以被修改,不能被注入到config
中,但是它可以被decorator
装饰.var app = angular.module('app', []); // 方式一 app.config(function ($provide) { $provide.value('me', 'is value') }); // 方式二 app.value('me', 'is value');
-
service
一个可注入的构造器,在
AngularJS
中它是单例的,用它在Controller
中通信或者共享数据都很合适var app = angular.module('app' ,[]); // 方式一 app.config(function ($provide) { $provide.service('me', function () { this.title = 'is me service'; }); }); // 方式二 app.service('me', function () { this.title = 'is me service'; });
-
factory
一个可注入的
function
,它和service
的区别就是:factory
是普通function
,而
service
是一个构造器constructor
,这样
Angular
在调用service
时会用new
关键字,而调用factory
时只是调用普通的function
,所以factory
可以返回任何东西,而service
可以不返回var app = angular.module('app', []); // 方式一 app.config(function ($provide) { $provide.factory('me', function () { return { title: 'is factory' } }); }); // 方式二 app.factory('me', function () { return { title: 'is factory' } });
-
provider
var app = angular.module('app', []); // 创建 app.provider('me', function () { var version; return { setVersion: function (value) { lev = value; }, // 必须有 `$get`方法 $get: function () { return { title: 'my love' + ' ' + lev } } } }); // 配置阶段可调用 app.config(function (meProvider) { movieProvider.setVersion(1); });
注意这里
config
方法注入的是meProvider
,上面定义了一个供应商叫
me
,但是注入到config
中不能直接写me
,因为前文讲了注入的那个东西就是服务,是供应商提供出来的,
而
config
中又只能注入供应商(两个例外是$provide
和$injector
),所以用驼峰命名法写成meProvider
,Angular
就会帮你注入它的供应商。 -
decorator
该方法无法创建var app = angular.module('app', []); app.value('meTitle', 'code'); app.config(function ($provide) { $provide.decorator('meTitle', function ($delegate) { return $delegate + '- decorator'; }); });
这个比较特殊,它不是
provider
,它是用来装饰其他provider
的,而前面也说过,他不能装饰Constant
,因为实际上Constant
不是通过provider()
方法创建的。
总结
- 所有的供应商都只被实例化一次,都是单例的
- 除了
constant
,所有的供应商都可以被装饰器(decorator
)装饰 value
就是一个简单的可注入的值service
是一个可注入的构造器factory
是一个可注入的方法decorator
可以修改或封装其他的供应商,当然除了constant
provider
是一个可配置的factory
快速功能对比:
功能/类型 | Factory | Service | Value | Constant | Provider |
---|---|---|---|---|---|
可以有依赖 | Yes | Yes | No | No | Yes |
注入没有限制 | No | Yes | Yes | Yes | No |
可在配置阶段使用 | No | No | No | Yes | Yes |
可以创建函数 | Yes | Yes | Yes | Yes | Yes |
可以创建原始对象 | Yes | No | Yes | Yes | Yes |