关于AngularJS中几种Providers的区别总结


Posted in Javascript onMay 17, 2020

原文:https://xebia.com/blog/differ...

什么是Provider?

AngularJS文档对provider的定义:

provider是一个带有$get()方法的对象。injector调用$get方法创建一个新的service的实例。provider还有一些其他的方法,可以用来配置provider。

AngularJS使用$provide注册新的providers。providers基本上都会创建一个新实例, 但每个provider只创建一次。$provide提供了6种方法创建自定义provider, 我会用简单的代码示例分别解释他们。

6种方法如下:

  • constant
  • value
  • service
  • factory
  • decorator
  • provider

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是一个简单的可被注入的值,可以是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是一个单例, 只被创建一次。services是一个很好的方式,用于控制器之间传递数据,如共享数据。

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是一个可注入的函数。

与service的相同点:factory也是一个单例,也可以在此函数中指定依赖。

区别是:factory注入一个普通函数,AngularJs将调用此函数,而service注入一个构造函数。

service是一个构造函数,要调用new创建一个新对象。而用factory,你可以让这个函数返回你想要的任何东西。
你将会看到,factory是一个只有$get方法的provider。

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函数和配置选项。

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只会被实例化一次,因此他们都是单例的。

除了constant,其他的providers都可以被decorated。

constant是一个值, 可以被注入到任何地方,它的值不能被改变。

value是一个简单的可注入的值。

service是一个可注入的构造函数。

factory是以个可注入的函数。

decorator可以修改或封装其它的providers,除了constant。

provider是一个可配置的factory。

到此这篇关于关于AngularJS中几种Providers的区别总结的文章就介绍到这了,更多相关AngularJS中Providers区别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
用js+xml自动生成表格的东西
Dec 21 Javascript
JS实现随机数生成算法示例代码
Aug 08 Javascript
JavaScript调用客户端的可执行文件(示例代码)
Nov 28 Javascript
用js通过url传参把数据从一个页面传到另一个页面
Sep 01 Javascript
判断字符串的长度(优化版)中文占两个字符
Oct 30 Javascript
javaScript知识点总结(必看篇)
Jun 10 Javascript
JavaScript数据类型的存储方法详解
Aug 25 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
Dec 20 Javascript
JSX在render函数中的应用详解
Sep 04 Javascript
微信小程序tabBar设置实例解析
Nov 14 Javascript
JavaScript交换两个变量方法实例
Nov 25 Javascript
javascript中的with语句学习笔记及用法
Feb 17 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 #Javascript
JavaScript链式调用原理与实现方法详解
May 16 #Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
May 16 #Javascript
JavaScript接口实现方法实例分析
May 16 #Javascript
JavaScript 类的封装操作示例详解
May 16 #Javascript
jquery+css3实现的经典弹出层效果示例
May 16 #jQuery
js抽奖转盘实现方法分析
May 16 #Javascript
You might like
PHP对象Object的概念 介绍
2012/06/14 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
详解Angular.js中$http拦截器的介绍及使用
2017/07/04 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
JavaScript 处理树数据结构的方法示例
2019/06/16 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
Python操作MySQL数据库9个实用实例
2015/12/11 Python
python编码最佳实践之总结
2016/02/14 Python
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
Python 复平面绘图实例
2019/11/21 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
25道Java面试题集合
2013/05/21 面试题
老师给学生的表扬信
2014/01/17 职场文书
酒店节能减排方案
2014/05/26 职场文书
法英专业大学生职业生涯规划范文:衡外情,量己力!
2014/09/23 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
机关作风建设工作总结
2014/10/23 职场文书
入股协议书范本
2014/11/01 职场文书
旗帜观后感
2015/06/08 职场文书