相關(guān)教程推薦:《angular教程》
什么是provider?
angularjs文檔對(duì)provider的定義:
provider是一個(gè)帶有$get()方法的對(duì)象。injector調(diào)用$get方法創(chuàng)建一個(gè)新的service的實(shí)例。provider還有一些其他的方法,可以用來(lái)配置provider。
angularjs使用$provide注冊(cè)新的providers。providers基本上都會(huì)創(chuàng)建一個(gè)新實(shí)例, 但每個(gè)provider只創(chuàng)建一次。$provide提供了6種方法創(chuàng)建自定義provider, 我會(huì)用簡(jiǎn)單的代碼示例分別解釋他們。
6種方法如下:
constant
value
service
factory
decorator
provider
constant
constant能被injected到任何地方。constant不能被decorator攔截, 意味著constant的值永遠(yuǎn)不能被改變。
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提供了一種更簡(jiǎn)便的方式創(chuàng)建constant. 你可以將上面3至5行的代碼重寫為:
app.constant('movietitle', 'the matrix');value
value是一個(gè)簡(jiǎn)單的可被注入的值,可以是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');})創(chuàng)建value的簡(jiǎn)單方法:
app.value('movietitle', 'the matrix');service
service是一個(gè)可以注入的構(gòu)造函數(shù)。如果你想,你可以在函數(shù)中指定需要的依賴。
service是一個(gè)單例, 只被創(chuàng)建一次。services是一個(gè)很好的方式,用于控制器之間傳遞數(shù)據(jù),如共享數(shù)據(jù)。
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');});創(chuàng)建service簡(jiǎn)單方式:
app.service('movie', function () { this.title = 'the matrix';});factory
factory是一個(gè)可注入的函數(shù)。
與service的相同點(diǎn):factory也是一個(gè)單例,也可以在此函數(shù)中指定依賴。
區(qū)別是:factory注入一個(gè)普通函數(shù),angularjs將調(diào)用此函數(shù),而service注入一個(gè)構(gòu)造函數(shù)。
service是一個(gè)構(gòu)造函數(shù),要調(diào)用new創(chuàng)建一個(gè)新對(duì)象。而用factory,你可以讓這個(gè)函數(shù)返回你想要的任何東西。
你將會(huì)看到,factory是一個(gè)只有$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');});創(chuàng)建factory的簡(jiǎn)單方式:
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中最復(fù)雜的,可以有復(fù)雜的creation函數(shù)和配置選項(xiàng)。
provider實(shí)際是一個(gè)可配置的factory。 provider接受一個(gè)對(duì)象或構(gòu)造函數(shù)。
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');});總結(jié)
所有的providers只會(huì)被實(shí)例化一次,因此他們都是單例的。
除了constant,其他的providers都可以被decorated。
constant是一個(gè)值, 可以被注入到任何地方,它的值不能被改變。
value是一個(gè)簡(jiǎn)單的可注入的值。
service是一個(gè)可注入的構(gòu)造函數(shù)。
factory是以個(gè)可注入的函數(shù)。
decorator可以修改或封裝其它的providers,除了constant。
provider是一個(gè)可配置的factory。
英文原文地址:https://xebia.com/blog/differences-between-providers-in-angularjs/
相關(guān)推薦:編程教學(xué)
云服務(wù)器高防服務(wù)器租用哪家好國(guó)資入場(chǎng),威馬完成100億人民幣D輪融資!中小企業(yè)物聯(lián)網(wǎng)部署:使用API解決物理網(wǎng)部署問題云服務(wù)器怎么開分機(jī)買云服務(wù)器選什么系統(tǒng)網(wǎng)站經(jīng)常打不開已經(jīng)聯(lián)系你們修復(fù)過兩次了麻煩審核一下-備案平臺(tái)騰訊云服務(wù)器怎么更新系統(tǒng)教程