[译]AngularJS中几种Providers(Factory, Service, Provider)的区别
原文: http://blog.xebia.com/2013/09/01/differences-between-providers-in-angularjs/
什么是Provider?
AngularJS docs 是这样定义provider的:
provider是一个对象, 它有一个$get()方法. injector 调用$get方法以此来创建一个service的实例. Provider还有一些其他的方法用来配置provider.
AngularJS 使用 $provide 注册新的provider. providers 基本上都会创建一个新的实例, 但是每一个provider只有一个实例. $provide 有6种创建自定义provider的方法, 下面我会分别解释这6种方法的用法. 6种方法如下:
Constant
constant能被injected到任何地方. constant不会被decorator拦截, 这一位这constant的值是永远不变的.
var app = angular.module('app', []); app.config(function ($provide) {
$provide.constant('movieTitle', 'The Matrix');
}); app.controller('ctrl', function (movieTitle) {
expect(movieTitle).toEqual('The Matrix');
});
AngularJS提供了一种更简便的方便用来创建constant. 你可以将上面3至5行的代码重写为:
app.constant('movieTitle', 'The Matrix');
Value
value是一个简单的可被注入的值. value可以是string, number, function. 和constant不同的是value不能被注入到configurations, 且value能被decorators拦截.
var app = angular.module('app', []); app.config(function ($provide) {
$provide.value('movieTitle', 'The Matrix')
}); app.controller('ctrl', function (movieTitle) {
expect(movieTitle).toEqual('The Matrix');
})
value也用一个简单的写法
app.value('movieTitle', 'The Matrix');
Service
service是一个可以注入的构造函数. service是 singleton 的, 只会被创建一次. Services 用来给controller提供数据是一个不错的选择.
var app = angular.module('app' ,[]); app.config(function ($provide) {
$provide.service('movie', function () {
this.title = 'The Matrix';
});
}); app.controller('ctrl', function (movie) {
expect(movie.title).toEqual('The Matrix');
});
service也有一个简单的写法:
app.service('movie', function () {
this.title = 'The Matrix';
});
Factory
factory是以个可注入的function. factory和service非常相似, 也是单例的. a factory是一个简单的 provider 只有$get方法.
var app = angular.module('app', []); app.config(function ($provide) {
$provide.factory('movie', function () {
return {
title: 'The Matrix';
}
});
}); app.controller('ctrl', function (movie) {
expect(movie.title).toEqual('The Matrix');
});
factory也有一个简单的写法
app.factory('movie', function () {
return {
title: 'The Matrix';
}
});
Decorator
decorator可以修改封装其它的providers. 注意了constant不能被装饰.
var app = angular.module('app', []); app.value('movieTitle', 'The Matrix'); app.config(function ($provide) {
$provide.decorator('movieTitle', function ($delegate) {
return $delegate + ' - starring Keanu Reeves';
});
}); app.controller('myController', function (movieTitle) {
expect(movieTitle).toEqual('The Matrix - starring Keanu Reeves');
});
Provider
provider是所有providers中最复杂的. 可以有负责的creation function和配置选项. provider是一个可配置的factory. provider接受一个对象或构造函数.
var app = angular.module('app', []); app.provider('movie', function () {
var version;
return {
setVersion: function (value) {
version = value;
},
$get: function () {
return {
title: 'The Matrix' + ' ' + version
}
}
}
}); app.config(function (movieProvider) {
movieProvider.setVersion('Reloaded');
}); app.controller('ctrl', function (movie) {
expect(movie.title).toEqual('The Matrix Reloaded');
});
总结
- 所有的providers只会被实例化一次. 这一位着他们都是单例的.
- 所有的providers 除了constant都可以被decorated.
- constant是以个值, 可以被注入到任意地方. constant的值不能被改变.
- value是一个简单的可注入的值.
- service是一个可注入的构造函数.
- factory是以个可注入的function.
- decorator可以修改封装其它的providers除了constant.
- provider是一个可配置的factory.
[译]AngularJS中几种Providers(Factory, Service, Provider)的区别的更多相关文章
- angularjs 中 Factory,Service,Provider 之间的区别
本片文章是使用了 angularjs 中使用 service 在controller 之间 share 对象和数据 的code(http://jsfiddle.net/kn46u0uj/1/) 来进行 ...
- angularjs factory,service,provider 自定义服务的不同
angularjs框架学了有一段时间了,感觉很好用.可以把angularjs的app理解成php的class,controller是控制器,而内置服务和自定义服务就可以理解成models了.angul ...
- AngularJS 讲解五, Factory ,Service , Provider
一. 首先说一下,为什么要引入Factory,Service和Provider这三个Service层. 1.因为我们不应该在controller层写入大量的业务逻辑和持久化数据,controller层 ...
- centos7也支持service命令启动服务吗,对于centos7 中的systemctl和旧的service命令的区别和联系
一.centos7也支持service命令启动服务吗 CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服 ...
- java中4种修饰符访问权限的区别及详解全过程
java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为 ...
- AngularJS服务中serivce,factory,provider的区别
Angular服务是一个由服务工厂创建的单例对象.这些服务工厂是由 service provider 依次创建的.而service providers是构造函数.它们必须包含一个$get属性用于在实例 ...
- 深入了解angularjs中的$digest与$apply方法,从区别聊到使用优化
壹 ❀ 引 如果有人问,在angularjs中修改模型数据为何视图会同步更新呢,我想大多数人一定会回答脏检查(Dirty Checking)相关概念.没错,在angularjs中作用域(scope) ...
- angularjs中directive指令与component组件有什么区别?
壹 ❀ 引 我在前面花了两篇博客分别系统化介绍了angularjs中的directive指令与component组件,当然directive也能实现组件这点毋庸置疑.在了解完两者后,即便我们知道co ...
- AngularJS中service,factory,provider的区别(转载:http://my.oschina.net/tanweijie/blog/295067)
目录[-] 一.service引导 二.service 1.factory() 2.service() 3.provider() 一.service引导 刚开始学习Angular的时候,经常 ...
随机推荐
- squid日志时间转换
squid日志时间是unix时间戳 不利于观看 python脚本进行转换 #!/usr/bin/env python #2014-6-5 pdd import re import time impor ...
- A.Kaw矩阵代数初步学习笔记 1. Introduction
“矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...
- Loadrunner在post请求的cookie中插入其它多个值
有一个商城,提交订单的时候,需要在post请求的cookie中set一个code码,便于防刷 tijiao() { lr_think_time(); web_reg_save_param(" ...
- UVALive 3989Ladies' Choice(稳定婚姻问题)
题目链接 题意:n个男生和女生,先是n行n个数,表示每一个女生对男生的好感值排序,然后是n行n列式每一个男生的好感值排序,输出N行,即每个女生在最好情况下的男生的编号 分析:如果是求女生的最好情况下, ...
- POJ1050To the Max(求最大子矩阵)
题目链接 题意:给出N*N的矩阵,求一个子矩阵使得子矩阵中元素和最大 分析: 必备知识:求一组数的最大连续和 int a[N]; ,maxn = -INF; ; i <= n; i++) { i ...
- Arcgis 几何网络分析
ArcGIS:网络分析(转) 由于之前对网络分析的理解有很多问题,所以在网上找了一些资料,这是其中一篇我觉得比较好的,所以就整理了一下,发到网上来,留个底吧,呵呵 注:关于几何网络的建立见前面的& ...
- Linq------各种查询语句大全
查询Title列的第一个值 string str = db.Webs.Select(p => p.Title).FirstOrDefault(); 根据ID,查询Title列的第一个值 b.We ...
- WinForm------TreeList修改节点图标和按钮样式
转载: https://documentation.devexpress.com/#WindowsForms/DevExpressXtraTreeListTreeList_CustomDrawNode ...
- 分页进阶--ajax+jquery+struts2
按照上次的分页逻辑,分页查询的业务大概需要几个“零件”:1.当前页:2.总页数:3.跳转页.后端需要处理的是:按照传送过来请求的页码返回相应地数据,并且接受初始化参数的请求:总页码.第一页的数据. 使 ...
- Python获取文件名
本文实例讲述了python实现从URL地址提取文件名的方法.分享给大家供大家参考.具体分析如下: 如:地址为 http://www.jb51.net/images/logo.gif 要想从该地址提取l ...