关于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 相关文章推荐
jquery入门—编写一个导航条(可伸缩)
Jan 07 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
Aug 20 Javascript
JS实现可点击展开与关闭的左侧广告代码
Sep 02 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
Jan 14 Javascript
总结JavaScript三种数据存储方式之间的区别
May 03 Javascript
全面了解javascript中的错误处理机制
Jul 18 Javascript
关于Vue.js一些问题和思考学习笔记(2)
Dec 02 Javascript
jQuery实现文档树效果
Feb 20 Javascript
JavaScript正则获取地址栏中参数的方法
Mar 02 Javascript
Bootstrap媒体对象学习使用
Mar 07 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
Sep 16 Javascript
node通过express搭建自己的服务器
Sep 30 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
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
些很实用且必用的小脚本代码
2006/06/26 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
2018/06/07 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
Python对列表排序的方法实例分析
2015/05/16 Python
python使用super()出现错误解决办法
2017/08/14 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
Python的垃圾回收机制详解
2019/08/28 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
AJAX的优缺点都有什么
2015/08/18 面试题
播音主持女孩的自我评价分享
2013/11/20 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
2015年话务员工作总结
2015/04/29 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
js判断两个数组相等的5种方法
2022/05/06 Javascript
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android