关于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 相关文章推荐
innerText和innerHTML 一些问题分析
May 18 Javascript
js下通过getList函数实现分页效果的代码
Sep 17 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
Jan 13 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
Apr 06 Javascript
JavaScript基于原型链的继承
Jun 22 Javascript
浅谈js中对象的使用
Aug 11 Javascript
javascript正则表达式模糊匹配IP地址功能示例
Jan 06 Javascript
jQuery实现用户输入自动完成功能
Feb 13 Javascript
详解微信小程序 template添加绑定事件
Jun 23 Javascript
mint-ui的search组件在键盘显示搜索按钮的实现方法
Oct 27 Javascript
微信小程序实现复选框效果
Dec 28 Javascript
在 Vue 中编写 SVG 图标组件的方法
Feb 24 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自定义函数收代码
2010/08/01 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
在html文件中也可以执行php语句的方法
2015/04/09 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
2015/11/05 PHP
javascript面向对象入门基础详细介绍
2012/09/05 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
2014/03/27 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
JavaScript常用事件介绍
2019/01/21 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
python常用函数详解
2016/09/13 Python
Python numpy 点数组去重的实例
2018/04/18 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
使用pip安装python库的多种方式
2019/07/31 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
生物技术专业研究生自荐信
2013/09/22 职场文书
高中生学习生活的自我评价
2013/10/09 职场文书
软件工程师岗位职责
2013/11/16 职场文书
大学生入党思想汇报
2014/01/14 职场文书
作风建设年活动实施方案
2014/10/24 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript