angularjs中的factory,service与provider的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了angularjs中的factory,service与provider的区别相关的知识,希望对你有一定的参考价值。

参考技术A

在Angular中,控制器应该是简洁精炼的;一些逻辑和重复性的数据都应该要存储到服务中。控制器就应该在需要他们的时候实例化,在不需要的时候就取消掉。因此,Angular在你每次切换路由的时候,就会清理当前的控制器。但是呢,服务为我们提供了一种长期存储应用数据的方式,同时,也可以在不同的控制器之间统一的使用服务。

Angular为我们提供了三种创建服务的方式:

废话不多说,简要分析一下。

factory新创建了一个对象,然后在这个对象上新添属性,最后返回这个对象。
service使用new关键词进行了实例化。只需要在this上添加属性和方法,服务就会自动的返回this。

factory与service在controller的用法并没有什么不同,不要以为service每次注入controller都要new一次,AngularJS 在初始化的时候,会new一次service,所以当 controller 要求注入 service 的时候,AngularJS 就会把已经 new 过的的 service 给 controller。

注意: Provider 都是 singleton !!!!!

没错,所以就算 service 有 new 这个指令,可是其实也只是做一次而已。
每个要求注入 service 的 components 拿到的都会是同一个service reference。
factory 也是相同的情况,全部系统共用一个 Factory reference。

所以我们才用Provider做controller之间传值的桥梁!!!

Provider:

provider是唯一一种可以创建用来注入到config()函数的服务的方式。想在你的服务启动之前,进行一些模块化的配置的话,就使用provider。

来简单的说明一下 Provider 跟 Factory 和 Service 的关系。个人觉得 Mark Meyer 在 top 10 mistakes angularjs developers make 文章解说的很好。把 code 借来并附上我的注解。

再来看看provider的使用方式:

你可以认为provider有三个部分,第一部分是私有变量和私有函数,这些变量和函数会在以后被修改。第二部分是在app.config函数里可以访问的变量和函数,所以,他们可以在在其他地方使用之前被修改。注意,这些变量和函数一定要添加到this上面才行。在我们的例子中,app.config()函数能够修改的只有thingFromConfig。第三部分是在控制器里可以访问的变量和函数。

当使用 provider创建服务的时候,唯一可以让控制器访问的属性和方法是在$get()函数里返回的属性和方法。将$get添加到了this上面,最终这个函数会被返回。

AngularJS中service,factory,provider的区别

1、factory()

Angular里面创建service最简单的方式是使用factory()方法。

factory()让我们通过返回一个包含service方法和数据的对象来定义一个service。在service方法里面我们可以注入services,比如 $http 和 $q等。

在service里面当我们仅仅需要的是一个方法和数据的集合且不需要处理复杂的逻辑的时候,factory()是一个非常不错的选择。

注意:需要使用.config()来配置service的时候不能使用factory()方法

2、service()

service()通过构造函数的方式让我们创建service,我们可以使用原型模式替代javaScript原始的对象来定义service。

和factory()方法一样我们也可以在函数的定义里面看到服务的注入。service()方法会持有构造函数创建的对象。

service()方法很适合使用在功能控制比较多的service里面

注意:需要使用.config()来配置service的时候不能使用service()方法

3、provider()

provider()是创建service最底层的方式,这也是唯一一个可以使用.config()方法配置创建service的方法

不像上面提到的方法那样,我们在定义的this.$get()方法里面进行依赖注入

什么时候使用provider()方法

  1. 当我们希望在应用开始前对service进行配置的时候就需要使用到provider()。比如,我们需要配置services在不同的部署环境里面(开发,演示,生产)使用不同的后端处理的时候就可以使用到了

  2. 当我们打算发布开源provider()也是首选创建service的方法,这样就可以使用配置的方式来配置services而不是将配置数据硬编码写到代码里面。

以上是关于angularjs中的factory,service与provider的区别的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS中service,factory,provider的区别

AngularJS进阶(三十三)书海拾贝之简介AngularJS中使用factory和service的方法

angularjs---服务(service / factory / provider)

angularjs-factory,provider,service,constant,value,decorator

[AngularJS面面观] 23. 依赖注入 --- Factory vs Service

angularJs中service、factory、controller之间的区别及适用场景?