Mai mult
AngularJS: Serviciu vs furnizor vs fabrică
Care sunt diferențele dintre un Service
, Provider
și Factory
în AngularJS?
3291
3
Care sunt diferențele dintre un Service
, Provider
și Factory
în AngularJS?
De pe lista de discuții AngularJS am primit un fir de discuție uimitor care explică serviciul vs fabrica vs furnizorul și utilizarea injecției acestora. Compilarea răspunsurilor:
Servicii
Sintaxă:
module.service( 'serviceName', function );`` <br/> Rezultatul: "Service": La declararea lui ServiceName ca argument injectabil **se va primi o instanță a funcției. Cu alte cuvinte**
new FunctionYouPassedToService()`.Factories
Sintaxă: `module.factory( 'factoryName', function );``
Rezultatul: Atunci când declarați factoryName ca argument injectabil, veți primi valoarea care este returnată prin invocarea referinței funcției transmise la module.factory.
Provideri
Sintaxă:
module.provider( 'providerName', function );`` <br/> Rezultatul: "Provider": La declararea providerName ca argument injectabil **se va primi**
(new ProviderFunction()).$get(). Funcția constructor este instanțiată înainte de apelarea metodei $get -
ProviderFunction` este referința funcției transmisă la module.provider.Furnizorii au avantajul că pot fi configurați în timpul fazei de configurare a modulului.
A se vedea aici pentru codul furnizat.
Aici'i o explicație suplimentară excelentă de către Misko:
În acest caz, injectorul returnează pur și simplu valoarea așa cum este. Dar ce se întâmplă dacă doriți să calculați valoarea? Atunci folosiți o fabrică
Așadar,
factory
este o funcție care este responsabilă pentru crearea valorii. Observați că funcția factory poate solicita alte dependențe.Dar ce se întâmplă dacă doriți să fiți mai OO și să aveți o clasă numită Greeter?
Atunci, pentru a o instanția, ar trebui să scrieți
Apoi am putea cere 'greeter' în controler astfel
Dar asta este mult prea mult prea mult. Un mod mai scurt de a scrie acest lucru ar fi `provider.service('greeter', Greeter);``.
Dar dacă am dori să configurăm clasa
Greeter
înainte de injecție? Atunci am putea scrieApoi putem face acest lucru:
Ca o notă suplimentară,
service
,factory
șivalue
sunt toate derivate din provider.[JS Fiddle Demo][1]
" Hello world " exemplu cu
factory
/service
/provider
:Am observat ceva interesant când m-am jucat cu furnizorii.
Vizibilitatea injectabilelor este diferită pentru furnizori față de cea pentru servicii și fabrici. Dacă declarați o "constantă" AngularJS (de exemplu,
myApp.constant('a', 'Robert');
), o puteți injecta în servicii, fabrici și furnizori.Dar dacă declarați o "valoare" AngularJS (de exemplu,
myApp.value('b', {name: 'Jones'});
), o puteți injecta în servicii și fabrici, dar NU în funcția de creare a furnizorului. Cu toate acestea, o puteți injecta în funcția$get
pe care o definiți pentru furnizorul dumneavoastră. Acest lucru este menționat în documentația AngularJS, dar este ușor de omis. O puteți găsi pe pagina %provide, în secțiunile referitoare la metodele value și constant.http://jsfiddle.net/R2Frv/1/