Viac na
AngularJS: Služba vs poskytovateľ vs továreň
Aké sú rozdiely medzi Service
, Provider
a Factory
v AngularJS?
3291
3
Aké sú rozdiely medzi Service
, Provider
a Factory
v AngularJS?
Z AngularJS mailing listu som dostal úžasné vlákno, ktoré vysvetľuje služby vs. factory vs. provider a ich použitie pri injektovaní. Kompilácia odpovedí:
Services
Syntax:
module.service( 'serviceName', function );
Výsledok: Pri deklarácii serviceName ako injektovateľného argumentu bude poskytnutá inštancia funkcie. Inými slovami
new FunctionYouPassedToService()
.Faktory
Syntax:
module.factory( 'factoryName', function );
Výsledok: Pri deklarovaní factoryName ako injektovateľného argumentu dostanete hodnotu, ktorá sa vráti po vyvolaní referencie na funkciu odovzdanú module.factory.
Providers
Syntax:
module.provider( 'providerName', function );
Výsledok: Pri deklarovaní providerName ako injektovateľného argumentu budete mať k dispozícii
(new ProviderFunction()).$get()
. Funkcia konštruktora sa inštanciuje pred zavolaním metódy $get -ProviderFunction
je odkaz na funkciu odovzdanú do module.provider.Poskytovatelia majú tú výhodu, že ich možno konfigurovať počas fázy konfigurácie modulu.
Poskytnutý kód nájdete v tu.
Tu'je skvelé ďalšie vysvetlenie od Miška:
V tomto prípade injektor jednoducho vráti hodnotu takú, aká je. Ale čo ak chcete hodnotu vypočítať? Potom použite továreň
Takže
factory
je funkcia, ktorá je zodpovedná za vytvorenie hodnoty. Všimnite si, že funkcia factory môže požiadať o ďalšie závislosti.Ale čo ak chcete byť viac OO a mať triedu s názvom Greeter?
Potom by ste na vytvorenie inštancie museli napísať
Potom by sme mohli požiadať o 'greeter' v kontroléri takto
Ale to je príliš zložité. Kratšie by sa to dalo napísať takto:
provider.service('greeter', Greeter);
Ale čo ak by sme chceli nakonfigurovať triedu
Greeter
pred injekciou? Potom by sme mohli napísaťPotom môžeme urobiť toto:
Ako vedľajšiu poznámku uvádzame, že
service
,factory
avalue
sú odvodené od provider.[JS Fiddle Demo][1]
" Hello world " príklad s
factory
/service
/provider
:Pri hraní s poskytovateľmi som si všimol niečo zaujímavé.
Viditeľnosť injekcií je pre poskytovateľov iná ako pre služby a továrne. Ak deklarujete AngularJS "konštantu" (napríklad
myApp.constant('a', 'Robert');
), môžete ju injektovať do služieb, faktorov a poskytovateľov.Ak však deklarujete AngularJS "value" (napríklad
myApp.value('b', {name: 'Jones'});
), môžete ju injektovať do služieb a tovární, ale NIE do funkcie vytvárajúcej poskytovateľa. Môžete ho však injektovať do funkcie$get
, ktorú definujete pre svojho poskytovateľa. Je to spomenuté v dokumentácii AngularJS, ale je ľahké to prehliadnuť. Nájdete ju na stránke %provide v častiach o metódach value a constant.http://jsfiddle.net/R2Frv/1/