AngularJS 服务 provider factory service及区别
一、概念说明
1、服务是对公共代码的抽象,如多个控制器都出现了相似代码,把他们抽取出来,封装成一个服务,遵循DRY原则,增强可维护性,剥离了和具体表现相关的部分,聚焦于业务逻辑或交互逻辑,更加容易被测试和复用。
2、工程实战中,使用服务的目的使为了优化结构,复用是一项结果,而不是目标。
3、代码中混杂表现层逻辑和业务逻辑的时候,就可以抽取服务,哪怕它不能复用。
4、测试驱动开发方式,服务有利于写测试用例。
5、服务是和依赖注入相关的,依赖注入要求服务都是单例,才能把它们到处注入,不用手动管理它们的生命周期,并可以“”延迟初始化“”等优化措施。
6、服务分常量(Constant)、变量(Value),服务(Service)、工厂(Factory)、供应商(Provider)。
7、变量和常量的区别是,变量的值可以被修改;服务是AngularJS会New出来,然后保存实例,供它注入,而工厂 ,AngularJS不会New,其会调用工厂里的函数,获取返回值,然后保存这个返回值,供它到处注入;Constant和Provider 可以传进 .config() 函数的服务,在Config阶段就可以用,其他都是要Provider实例化的结果,要在Config阶段完成后可用;除了常量外,其他服务背后都是通过Provider来实现的,可以看成是一张语法糖,编译后,其实都是Provider。
二、例子
1、provider provide
只要满足规则:提供一个带有返回值的$get方法。
是唯一一种可以传进 .config() 函数的 service。当你想要在 service对象启用之前,先进行模块范围的配置,那就应该用 provider。
app.provider('test', function() {
console.log('instance test');
var f = function(name) {
alert("Hello, " + name);
};
this.$get = function() { //一定要有!
return f;
};
});
app.config(function(testProvider) {
testProvider('I am config');
});
$provide服务负责告诉Angular如何创造一个新的可注入的东西:即服务。服务会被叫做供应商的东西来定义,你可以使用$provide来创建一个供应商。你需要使用$provide中的provider()方法来定义一个供应商,同时你也可以通过要求$provide被注入到一个应用的config函数中来获得$provide服务。使用方法是返回一个$get函数,注意在config阶段,只有provider能被注入
app.config(function($provide) {
$provide.provider('greeting', function() {
this.$get = function() {
return function(name) {
alert("Hello," + name);
};
};
});
/* greetingProvider('ff');*/
});
2、factory
factory 可以说是 provider 的变种, 方法中的第二个参数就是 $get 中的内容,需要new 一个对象返回。
app.factory('myFactory', function() {
console.log('instance myFactory');
var factory = {};
var privateValue = "I am Private";
factory.variable = "This is public";
factory.getPrivate = function() {
return privateValue;
};
return factory;
});
3、service
在 factory中需要 new 一个对象返回,而 service 就更简单了,这一步都帮你省了, 他的第二个参数就是你要返回的对象类,一般直接用this来操作数据、定义函数
app.service('myService', function() {
var privateValue = "I am Private";
this.variable = "This is public";
this.getPrivate = function() { return privateValue;
};
});
三、区别
service定义的function是一个构造器(constructor),Angular在调用service时会用new关键字,而调用factory时只是调用普通的function,所以factory可以返回任何东西,service不需要返回。AngularJS 服务 provider factory service及区别的更多相关文章
- AngularJS 中 Provider 的用法及区别
在一个分层良好的 Angular 应用中,Controller 这一层应该很薄.也就是说,应用里大部分的业务逻辑和持久化数据都应该放在 Service 里. 为此,理解 AngularJS 中的几个 ...
- AngularJS 讲解五, Factory ,Service , Provider
一. 首先说一下,为什么要引入Factory,Service和Provider这三个Service层. 1.因为我们不应该在controller层写入大量的业务逻辑和持久化数据,controller层 ...
- 【AngularJS中的自定义服务service VS factory VS provider】---它们的区别,你知道么?
在介绍AngularJS自定义服务之前,我们先来了解一下AngularJS~ 学过HTML的人都知道,HTML是一门很好的伪静态文本展示设计的声明式语言,但是,要构建WEB应用的话它就显得乏力了. 而 ...
- angularjs中provider,factory,service的区别和用法
angularjs中provider,factory,service的区别和用法 都能提供service,但是又有差别 service 第一次被注入时实例化,只实例化一次,整个应用的生命周期中是个单例 ...
- AngularJS中的Provider们:Service和Factory等的区别
引言 看了很多文章可能还是不太说得出AngularJS中的几个创建供应商(provider)的方法(factory(),service(),provider())到底有啥区别,啥时候该用啥,之前一直傻 ...
- angularjs factory,service,provider 自定义服务的不同
angularjs框架学了有一段时间了,感觉很好用.可以把angularjs的app理解成php的class,controller是控制器,而内置服务和自定义服务就可以理解成models了.angul ...
- AngularJS 1.x系列:AngularJS服务-Service、Factory、Provider、Value及Constant(5)
1. AngularJS服务 AngularJS可注入类型包括:Service.Factory.Provider.Value及Constant. 2. Service AngularJS Servic ...
- AngularJS 中的 factory、 service 和 provider区别,简单易懂
转自:http://blog.csdn.net/ywl570717586/article/details/51306176 初学 AngularJS 时, 肯定会对其提供 factory . serv ...
- angularjs 中 Factory,Service,Provider 之间的区别
本片文章是使用了 angularjs 中使用 service 在controller 之间 share 对象和数据 的code(http://jsfiddle.net/kn46u0uj/1/) 来进行 ...
随机推荐
- docker 运行 elasticsearch + kibana
一.elasticsearch的安装 1.从官网上拉取 elasticsearch 的镜像 docker pull elasticsearch:5.6.11docker images 2.运行容器 m ...
- Porsche PIWIS TESTER III
Allscanner VXDIAG Porsche Piwis III with Lenovo T440P Laptop Porsche Piwis tester III V37.250.020 N ...
- Eclipse创建Spring项目 未完
使用的软件及版本 1)Eclipse:Eclipse Java EE IDE for Web Developers :Version: 2018-09 (4.9.0) 2)JDK:java versi ...
- Tag file
JSP 2.0 引入 Tag file ,tag file 以 tag 或 tagx 为后缀,它们可以包含其他资源文件:一个被其他文件包含的 tag file 应该以 tagf 为后缀. 如同JSP页 ...
- linux上的工具或软件
1.下载软件 yum install axelaxel http://mirror.cse.iitk.ac.in/archlinux/iso/2015.04.01/archlinux-2015.04. ...
- GC垃圾收集器分类
参考https://blog.csdn.net/tjiyu/article/details/53983650 Java垃圾收集器组合: 新生代收集器:Serial.ParNew.Parallel Sc ...
- Windows-universal-samples学习笔记系列四:Data
Data Blobs Compression Content indexer Form validation (HTML) IndexedDB Logging Serializing and dese ...
- set集合的排序
在hibernate的OneToMany的实体关联的时候,one端的set是无序的,可是需要按照顺序来搞的话就比较麻烦了. 下面给出一个例子. Set<DiaryPicture> diar ...
- 2018.11.06 bzoj1835: [ZJOI2010]base 基站选址(线段树优化dp)
传送门 二分出每个点不需要付www贡献的范围,然后可以推出转移式子: f[i][j]=f[i−1][k]+value(k+1,j)+c[i]f[i][j]=f[i-1][k]+value(k+1,j) ...
- vue中使用promise.all发送多个请求
1.创建两个promise,在promise中使用axios 2.调用Promise.all([p1,p2]).then(res=>{}).catch(err=>{})方法 代码如下: & ...