相关教程推荐:《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/
相关推荐:编程教学
云服务器高防服务器租用哪家好国资入场,威马完成100亿人民币D轮融资!中小企业物联网部署:使用API解决物理网部署问题云服务器怎么开分机买云服务器选什么系统网站经常打不开已经联系你们修复过两次了麻烦审核一下-备案平台腾讯云服务器怎么更新系统教程