AngularJs几种服务区别
下面说说这几种函数之间的区别:
函数 | 定义 | 适合场景 |
---|---|---|
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服务,更多详细可见另外一篇文章。
AngularJs几种服务区别的更多相关文章
- Iass、Pass、SasS三种云服务区别?
Iass.Pass.SasS三种云服务区别 我们可以把云计算理解成一栋大楼,而这栋楼又可以分为顶楼.中间.低层三大块.那么我们就可以把Iass(基础设施).Pass(平台).Sass(软件)理解成这栋 ...
- 怎么理解angularjs中的服务?
AngularJS中的服务其实就是提供一种方式抽取共用类库 比如说一些工具类方法,我们传统的做法就是自己写个 utility 类,把相关的工具方法填充到utility里面去,最后把utility类放到 ...
- AngularJS之使用服务封装
AngularJS之使用服务封装可复用代码 创建服务组件 在AngularJS中创建一个服务组件很简单,只需要定义一个具有$get方法的构造函数, 然后使用模块的provider方法进行登记: / ...
- AngularJS之使用服务封装可复用代码
创建服务组件 在AngularJS中创建一个服务组件很简单,只需要定义一个具有$get方法的构造函数, 然后使用模块的provider方法进行登记: //定义构造函数 var myServicePro ...
- 让AngularJS的$http 服务像jQuery.ajax()一样工作
让AngularJS的$http 服务像jQuery.ajax()一样工作 $http的post . 请求默认的content-Type=application/json . 提交的是json对象的字 ...
- 云计算三种服务模式SaaS、PaaS和IaaS及其之间关系(顺带CaaS、MaaS)
云计算架构图 很明显,这五者之间主要的区别在于第一个单词,而aaS都是as-a-service(即服务)的意思,这五个模式都是近年来兴起的,且这五者都是云计算的落地产品,所以我们先来了解一下云计算是什 ...
- day 06云计算的三种服务模式:IaaS,PaaS和SaaS
云计算的三种服务模式:IaaS,PaaS和SaaS ”云服务”现在已经快成了一个家喻户晓的词了.如果你不知道PaaS, IaaS 和SaaS的区别,那么也没啥,因为很多人确实不知道. “云”其实是互联 ...
- 云计算的三种服务模式:IaaS,PaaS和SaaS
云服务”现在已经快成了一个家喻户晓的词了.如果你不知道PaaS, IaaS 和SaaS的区别,那么也没啥,因为很多人确实不知道. “云”其实是互联网的一个隐喻,“云计算”其实就是使用互联网来接入存储或 ...
- AngularJS 的异步服务测试与Mocking
测试 AngularJS 的异步服务 最近,在做项目时掉进了 AngularJS 异步调用 $q 测试的坑中,直接躺枪了.折腾了许久日子,终于想通了其中的道道,但并不确定是最佳的解决方案,最后还是决定 ...
随机推荐
- erlang驱动使用mysql-otp
Magnus Ahltorp的Mysql Driver里面介绍emysql的缺陷: 1. 隔离不够好, 2.不能伸缩 mysql-otp使用1个进程1个mysql连接,隔离得很好.推荐使用. mysq ...
- Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库 本文地址:https ...
- 手机uc不支持伪元素使用animation动画;移动端background-attachment:fixed不兼容性
20170503 1.手机uc不支持伪元素使用animation动画 (暂未解决) 2.移动端background-attachment:fixed不兼容性,没有任何效果, element:befor ...
- Android中res/layout文件夹里新建布局文件,R中不生成ID的奇葩错误
新浪微博:http://weibo.com/u/1928100503 网上看了下,发现大都是xml文件名大写而导致的id不能生成的问题,但在下的问题却不是大小写的问题,在下发现,当你的layout目录 ...
- oracle 关于表数据delete 后如何恢复
今天在PL/SQL中操作不小心删掉了某个表的部分数据,这可吓坏了本猿:于是悄悄的打开电脑,赶紧找度娘帮忙.经过度娘的小爬虫帮助,几分钟就把数据恢复了. 那么表数据delete掉后怎么恢复呢? 用fla ...
- js get selected text
js get selected text https://stackoverflow.com/questions/3170648/how-to-get-javascript-select-boxs-s ...
- BZOJ 1975 魔法猪学院(A*求K短路)
显然每次贪心的走最少消耗的路径即可.那么也就是找出最短路,次短路,,,K短路之后消耗E的能量的最多的路径条数. 也就是裸的A*算法. #include <bits/stdc++.h> us ...
- bzoj1272 Gate Of Babylon(计数方法+Lucas定理+乘法逆元)
Description Input Output Sample Input 2 1 10 13 3 Sample Output 12 Source 看到t很小,想到用容斥原理,推一下发现n种数中选m个 ...
- 【服务器_Tomcat】Tomcat的Server Options选项
一.配置 默认前两个是没有勾选的,应该勾选上: 在Cotext节点中有一个reloadable='true'属性,将它改为false,可以在修改java文件后不用重启服务器即可生效,但是不包括新建ja ...
- 【刷题】BZOJ 2260 商店购物
Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油 ...