在之前介绍angularjs的博客中,简单的介绍了angularjs提供的常用服务,以及如何自定义服务,具体可参见《angularjs 服务(service)》。在这一篇博客中,我将为大家详细介绍如何自定义服务,以及各种方式之间的区别。
<code>value(name, object)</code>方法允许我们直接将一个普通值或对象作为服务。我们通过一段代码来看看如何使用:
在这段代码中,我们是用<code>value</code>方法定义了一个服务,服务名称为<code>hqvalue</code>,值为:10,这是一个很简单的例子。
<code>constant(name, value)</code>也可以注册一个服务,值可以是一个字符串、数字、数组、对象或函数,和<code>value(name, object)</code>很像有木有。对上面的示例进行简单的修改:
细心的小伙伴应该可以发现<code>constant(name, value)</code>和<code>value(name, object)</code>的用法虽然很想,但是二者也是有区别的,不然也就没必要搞两个出来了,二者最大的区别在于使用<code>constant(name, value)</code>注册的服务可以在<code>config(configfn)</code>方法中注入,而<code>value(name, object)</code>不可以。通常用<code>value(name, object)</code>来注册服务对象或者函数,而用<code>constant(name, value)</code>来配置数据。
使用<code>service(name, constructor)</code>注册服务,服务对象是使用<code>new</code>进行实例化的,所以我们应该给<code>this</code>添加属性。
在这段代码中,我们使用了<code>service(name, constructor)</code>注册了一个服务,服务名为<code>hqstring</code>,我们为该服务添加了一个<code>touppercase</code>用于将字符串转换为大写。
使用<code>factory(name, providerfunction)</code>注册服务其实就是创建一个对象作为<code>providerfunction</code>的返回值,注入到<code>controller</code>中的其实就是创建的对象。我们使用<code>factory(name, providerfunction)</code>来实现<code>service(name, constructor)</code>同样的功能,代码如下:
<code>provider(name, provider)</code>是可以传入<code>config(configfn)</code>的服务,如果我们想要在 service对象启用之前,先进行模块范围的配置,那就应该用 provider。使用<code>provider(name, provider)</code>注册服务,我们需要为<code>this</code>添加<code>$get</code>函数,函数返回用于注入到<code>controller</code>中对象,我们也可以为<code>this</code>添加其他属性以便于我们在<code>config(configfn)</code>方法中使用。需要注意的是,如果我们的服务名称为:<code>hqstring</code>,那么我们在<code>config(configfn)</code>方法中注入的名称应该为:<code>hqstringprovider</code>。下面我们通过代码来看一下如何使用: