Page 143 - AngularJS权威教程
P. 143
14.3 创建服务时的设置项 123
value(值) 1
将这个值将作为可以注入的实例返回。
value()方法返回以name参数的值为名称的注册后的服务实例。 2
angular.module('myApp')
.value('apiKey','123123123'); 3
14.3.6 何时使用value()和constant()
4
value()方法和constant()方法之间最主要的区别是,常量可以注入到配置函数中,而值不行。
通常情况下,可以通过value()来注册服务对象或函数,用constant()来配置数据。 5
angular.module('myApp', [])
.constant('apiKey', '123123123') 6
.config(function(apiKey) {
// 在这里apiKey将被赋值为123123123
// 就像上面设置的那样 7
})
.value('FBid','231231231')
.config(function(FBid) {
// 这将抛出一个错误,未知的provider: FBid 8
// 因为在config函数内部无法访问这个值
});
9
14.3.7 decorator()
10
$provide服务提供了在服务实例创建时对其进行拦截的功能,可以对服务进行扩展,或者用
另外的内容完全代替它。
11
装饰器是非常强大的,它不仅可以应用在我们自己的服务上,也可以对AngularJS的核心服
务进行拦截、中断甚至替换功能的操作。事实上AngularJS中很多功能的测试就是借助
$provide.decorator()建立的。 12
对服务进行装饰的场景有很多,比如对服务进行扩展,将外部数据缓存进localStorage的功能,
或者对服务进行封装以便在开发中进行调试和跟踪等。 13
例如,我们想给之前定义的githubService服务加入日志功能,可以借助decorator()函数
方便地实现这个功能,而不需要对原始的服务进行修改。 14
decorator()函数可以接受两个参数。
15
name(字符串)
将要拦截的服务名称。
16
decoratorFn(函数)
在服务实例化时调用该函数,这个函数由injector.invoke调用,可以将服务注入这个函 17
数中。
$delegate是可以进行装饰的最原始的服务,为了装饰其他服务,需要将其注入进装饰器。 18