关于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 相关文章推荐
在视频前插入广告
Nov 20 Javascript
js中Math之random,round,ceil,floor的用法总结
Dec 26 Javascript
js验证输入是否为手机号码或电话号码示例
Dec 30 Javascript
jQuery之选项卡的简单实现
Feb 28 Javascript
三种动态加载js的jquery实例代码另附去除js方法
Apr 30 Javascript
使用node.js半年来总结的 10 条经验
Aug 18 Javascript
JavaScript中匿名函数用法实例
Mar 23 Javascript
js实现使用鼠标拖拽切换图片的方法
May 04 Javascript
向JavaScript的数组中添加元素的方法小结
Oct 24 Javascript
bootstrap导航条实现代码
Dec 28 Javascript
Javascript 链式作用域详细介绍
Feb 23 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
Aug 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
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
PHP里8个鲜为人知的安全函数分析
2014/12/09 PHP
js replace 与replaceall实例用法详解
2013/08/03 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
JS原生数据双向绑定实现代码
2017/08/14 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
SVG实现时钟效果
2018/07/17 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
JavaScript"模拟事件"的注意要点详解
2019/02/13 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
vue3中轻松实现switch功能组件的全过程
2021/01/07 Vue.js
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
python网络编程学习笔记(一)
2014/06/09 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
基于Python实现人脸自动戴口罩系统
2020/02/06 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
不同浏览器创建XMLHttpRequest方法有什么不同
2014/11/17 面试题
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
公司成本主管岗位责任制
2014/02/21 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server