angular:service、factory、provider使用和区别

引言:

不要往 controller 和 scope 里堆满不必要的逻辑。controller 这一层应该很薄;也就是说,应用里大部分的业务逻辑和持久化数据都应该放在 service 里。关于如何在 controller 里保存持久化数据。这就不是 controller 该干的事。出于内存性能的考虑,controller 只在需要的时候才会初始化,一旦不需要就会被抛弃。因此,每次当你切换或刷新页面的时候,Angular 会清空当前的 controller。与此同时,service 可以用来永久保存应用的数据,并且这些数据可以在不同的 controller 之间使用。

Angular 提供了3种方法来创建并注册我们自己的 service。

Factory

Service

Provider

-------------------------------------------------------------------------------------------------------------------------------------------

AngualrJs中可用来注入的有三种类型,service、factory、provider,这三种写法不样,用法也都不一样。其中,service只实例化一次,其实就是单例模式的思想。无论我们在什么地方注入我们的service,将永远使用同一个实例。所以对很多在controller层中的操作就可以放到serivce层中去。AngularJS提供例如许多内在的服务,如:$http, $route, $window, $location等。每个服务负责例如一个特定的任务,$http是用来创建AJAX调用,以获得服务器的数据。 $route用来定义路由信息等。内置的服务总是前缀$符号。

一、Service使用详解

简单service

依赖注入的三种方法

推荐使用方式1的理由是:

写法上比方法2更简单明了

比方法3更可靠(由于Javascript可以被压缩,AngularJS又是通过解析服务名称找到对应Service的,因此Javascript压缩之后AngularJS将无法找到指定的Service,但字符串不会被压缩,因此单独以字符串指定Service的名称可以避免这个问题)

使用方式1或方式2的注意点:

由于上述第二点原因,AngularJS在编译Html时,由$injector将数组中Service的名称与方法体中的Service进行一一映射。这种映射关系必须遵守由AngularJS的约定:

1.数组中Service名称的个数必须与方法体中Service名称的个数一致

2.数组中Service的顺序必须与方法体中Serivce的顺序一致

service使用示例:

结果是点按钮1===>i am private 点击按钮2 ===>this is public

Factory使用详解

Factory 一般就是创建一个对象,然后在对这个对象添加方法与数据,最后将些对象返回即可。然后注入到Controller层中即可。

记得一定要return一个Object对象,否则会报错

provider使用详解

?$provide服务负责告诉Angular如何创造一个新的可注入的东西:即服务。服务会被叫做供应商的东西来定义,你可以使用$provide来创建一个供应商。你需要使用$provide中的provider()方法来定义一个供应商,同时你也可以通过要求$provide被注入到一个应用的config函数中来获得$provide服务。使用方法是返回一个$get函数,注意在config阶段,只有provider能被注入。其它用法和service一样。

再看一个provider的示例:

页面刷新后,我们发现即使不注入这个providrer,但也它也进行实例化了,而service/factory则是第一次注入时才会初始化。而也这是为什么它可以注入到config的一个原因吧!

什么时候使用provider()方法?

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

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

Service、Factory、Provider三者区别

1) 用 Factory 就是创建一个对象,为它添加属性,然后把这个对象返回出来。你把 service 传进 controller 之后,在 controller 里这个对象里的属性就可以通过 factory 使用了。

2) Service 是用"new"关键字实例化的。因此,你应该给"this"添加属性,然后 service 返回"this"。你把 service 传进 controller 之后,在controller里 "this" 上的属性就可以通过 service 来使用了。

3) Providers 是唯一一种你可以传进 .config() 函数的 service。当你想要在 service 对象启用之前,先进行模块范围的配置,那就应该用 provider。

4)Factory/service是第一个注入时才实例化,而provider不是,它是在config之前就已实例 化好

同一函数三种不同写法:

写在最后,通过学习,我觉得

service最多的是:一些公用的前端方法可以整合在一个service里,例如,调用后端服务的方法,例如共同处理逻辑的方法,例如求今天是星期几

factory更多的是使用在数据初始化上,例如当我需要一些共用的数据时,通过factory对象里放一些get/set方法,一些默认值等

provider?由于它是唯一一种你可以传进 .config() 函数的 service,因此可以在调用service之前就可以走进provider,可以用来提前预处理一些逻辑

factory 和 service 功能类似,只不过 factory 是普通 function,可以返回任何东西(return 的都可以被访问);service 是构造器,可以不返回(绑定到 this 的都可以被访问);provider 是加强版 factory,返回一个可配置的 factory。