AngularJs 中可以使用两种途径来创建自定义服务:
使用模块内置的 $provide 方法
直接调用
factory service constant value
方法
下面说说这几种函数之间的区别:
函数 | 定义 | 适合场景 |
---|---|---|
provider(name, Object OR constructor() ) | 一个可配置的、有复杂逻辑的服务。如果你传递了一个对象,那么它应该有一个叫 $get 的函数返回这个这个服务的实例。否则的话,Angular 假设你已经产生了一个构造函数,当被调用时,创建这个实例 此函数是创建服务最具有变现力,相应地也是最复杂的,对于大多数情况,都没必要使用此函数,不过其对于测试和调试是极其有用的。 | 1. 当我们希望在应用开始前对 service 进行配置的时候就需要使用到 provide()。比如,我们需要配置 service 在不同的部署环境里面(开发,演示,生产)使用不同的后端处理的时候就可以使用到了。 2. 当我们打算发布开源 provide() 也是首选创建 service 的方法,这样就可以使用配置的方式来配置 service 而不是将配置数据硬编码写到代码里面。 |
factory(name, $getFunction() ) | 一个不可配置的、简单逻辑的服务。你指定一个函数,当被调用时,返回服务实例。你 可 认 为 是 provider(name,{$get:$getFunction()}) | 在 service 里面当我们仅仅需要的是一个方法和数据的集合且不需要处理复杂的逻辑的时候,factory() 是一个非常不错的选择。** 注意:** 需要使用. config() 来配置 service 的时候不能使用 factory() 方法 |
service(name, constructor() ) | 一个不可配置的、复杂逻辑的服务。有点类似于带构造函数的 provider,Angular 调用它来创建服务实例。 | service() 方法很适合使用在功能控制比较多的 service 里面 |
在 Angular 里面, services 作为单例对象在需要到的时候被创建, 只有在应用生命周期结束的时候 (关闭浏览器) 才会被清除. 而 controllers 在不需要的时候就会被销毁了.
这就是为什么使用 controllers 在应用里面传递数据不可靠的原因, 特别是使用 routing 的时候. services 在应用的 controllers, 方法, 数据之前起到了很关键的作用
现在我们开始看怎么创建 service. 每个方法我们都会看到下面两个一样的参数:
name - 我们要定义的 service 的名字
function-service 方法
他们都创建了相同的底层对象类型. 实例化后, 他们都创建了一个 service, 这些对象没有什么功能上的差别.
至于在工程实践中选择何种形式的服务, 可以遵循下列决策流程:
1. 需要全局的可配置参数 ==>Provider
2. 是纯数据, 没有行为 ==>Value
3. 只 new 一次, 不用参数 ==>Service
4. 拿到类, 自己 new 出实例 ==>Factory
5. 拿到函数, 自己调用 ==>Factory
复制代码
以上只是基本决策, 更加敏捷的方式:
是纯数据, 先用 Value, 当发现需要添加行为时, 改写为 Service; 或当发现需要通过计算给出结果时, 改写为 Factory; 当发现需要进行全局配置时, 改写为 Provider
复制代码
官方开发指南的对比表:
类型 | Factory | Service | Value | Constant | Provider |
---|---|---|---|---|---|
可以依赖其他服务 | 是 | 是 | 否 | 否 | 是 |
使用类型友好的注入 | 否 | 是 | 是 | 是 | 是 |
在 config 阶段可用 | 否 | 否 | 否 | 是 | 是 |
可以用于创建函数 / 原生对象 | 是 | 否 | 是 | 是 | 是 |
关于 Angular 服务, 更多详细可见另外一篇文章. http://blog.csdn.net/DeepLies/article/details/52830003
来源: https://juejin.im/post/5b717e28518825612077664d