További
AngularJS: Szolgáltatás vs szolgáltató vs gyár
Mi a különbség a Service
, Provider
és Factory
között az AngularJS-ben?
3291
3
Mi a különbség a Service
, Provider
és Factory
között az AngularJS-ben?
Az AngularJS levelezési listáról kaptam egy csodálatos szálat, amely elmagyarázza a service vs factory vs provider és az injektálásuk használatát. Összeállítom a válaszokat:
Services
Szintaxis:
module.service( 'serviceName', function );
Eredmény: A serviceName injektálható argumentumként való deklarálásakor a függvény egy példányát kapja meg. Más szóval
new FunctionYouPassedToService()
.Factories
Szintaxis:
module.factory( 'factoryName', function );
Eredmény: A factoryName bejuttatható argumentumként való deklarálásakor a modul.factory-nek átadott függvényhivatkozás meghívása által visszaadott értéket kapja.
Providers
Szintaxis:
module.provider( 'providerName', function );
Eredmény: A providerName injektálható argumentumként történő deklarálásakor a megkapja** a
(new ProviderFunction()).$get()
parancsot. A konstruktorfunkció a $get metódus meghívása előtt instanciálódik - aProviderFunction
a module.provider-nek átadott függvényreferencia.A szolgáltatók előnye, hogy a modul konfigurációs fázisában konfigurálhatók.
Lásd itt a megadott kódot.
Itt'van egy nagyszerű további magyarázat Misko-tól:
Ebben az esetben az injektor egyszerűen visszaadja az értéket úgy, ahogy van. De mi van akkor, ha ki akarod számolni az értéket? Akkor használjon egy gyárat
Tehát a
factory
egy függvény, amely az érték létrehozásáért felelős. Vegyük észre, hogy a factory függvény kérhet más függőségeket is.De mi van akkor, ha OO-sabbak akarunk lenni, és van egy Greeter nevű osztályunk?
Akkor a példányosításhoz azt kellene írnod, hogy
Ezután kérhetnénk a 'greeter' -t a vezérlőben így
De ez túlságosan is szószátyár. Rövidebb lenne a következő:
provider.service('greeter', Greeter);
.De mi van akkor, ha a
Greeter
osztályt az injektálás előtt akarjuk konfigurálni? Akkor azt írhatnánkAkkor ezt megtehetjük:
Mellékesen megjegyezzük, hogy a
service
,factory
ésvalue
mind a provider-ből származnak.[JS Fiddle Demo][1]
" Hello world " példa a
factory
/service
/provider
példával:Érdekes dolgot vettem észre, amikor a szolgáltatókkal játszottam.
Az injektálható anyagok láthatósága más a szolgáltatóknál, mint a szolgáltatásoknál és a gyáraknál. Ha deklarálsz egy AngularJS "konstans" (például
myApp.constant('a', 'Robert');
), akkor azt injektálhatod szolgáltatásokba, gyárakba és szolgáltatókba.Ha azonban egy AngularJS "értéket" (például:
myApp.value('b', {name: 'Jones'});
) deklarálsz, akkor azt a szolgáltatásokba és a gyárakba injektálhatod, de a szolgáltatót létrehozó függvénybe NEM. A szolgáltatóhoz definiált$get
függvénybe azonban befecskendezheti. Ezt az AngularJS dokumentációja is említi, de könnyű kihagyni. A %provide oldalon az érték és a konstans metódusokra vonatkozó szakaszokban találod.http://jsfiddle.net/R2Frv/1/