谈谈AngularJS中Providers之间的差异

谈谈AngularJS中Providers之间的差异

相关教程推荐:《angular教程》

什么是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。

英文原文地址:https://xebia.com/blog/differences-between-providers-in-angularjs/

相关推荐:编程教学

以上就是谈谈AngularJS中Providers之间的差异的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2726063.html

(0)
上一篇 2025年3月7日 23:28:49
下一篇 2025年3月4日 22:26:08

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论