关于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 相关文章推荐
setInterval 和 setTimeout会产生内存溢出
Feb 15 Javascript
JavaScript 异步调用框架 (Part 4 - 链式调用)
Aug 04 Javascript
仿百度的关键词匹配搜索示例
Sep 25 Javascript
告诉你什么是javascript的回调函数
Sep 04 Javascript
js实现多选项切换导航菜单的方法
Feb 06 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
Jun 10 Javascript
实现音乐播放器的代码(html5+css3+jquery)
Aug 04 Javascript
JavaScript实现的多个图片广告交替显示效果代码
Sep 04 Javascript
Angularjs 设置全局变量的方法总结
Oct 20 Javascript
AngualrJs清除定时器遇到的坑
Oct 13 Javascript
基于vue.js中事件修饰符.self的用法(详解)
Feb 23 Javascript
JavaScript实现多层颜色选项卡嵌套
Sep 21 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
杏林同学录(九)
2006/10/09 PHP
php简单获取复选框值的方法
2016/05/11 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
微博@符号的用户名提示效果。(想@到谁?)
2010/11/05 Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
2012/01/15 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
javascript数组的使用
2013/03/28 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
JS控制一个DIV层在指定时间内消失的方法
2014/02/17 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
微信小程序自定义音乐进度条的实例代码
2018/08/28 Javascript
JS实现的获取银行卡号归属地及银行卡类型操作示例
2019/01/08 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
react MPA 多页配置详解
2019/10/18 Javascript
Vue3.0的优化总结
2020/10/16 Javascript
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
netbeans7安装python插件的方法图解
2013/12/24 Python
对于Python中RawString的理解介绍
2016/07/07 Python
pandas多级分组实现排序的方法
2018/04/20 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
Python无头爬虫下载文件的实现
2020/04/02 Python
css3 transform 3d 使用css3创建动态3d立方体(html5实践)
2013/01/06 HTML / CSS
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
岗位职责的含义
2013/11/17 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
2014年组织部工作总结
2014/11/14 职场文书
2015年药房工作总结
2015/04/25 职场文书
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis