AngularJS: Tjeneste vs. leverandør vs. fabrikk
Hva er forskjellen mellom en Service
, Provider
og Factory
i AngularJS?
3291
3
Hva er forskjellen mellom en Service
, Provider
og Factory
i AngularJS?
Fra AngularJS-postlisten fikk jeg en fantastisk tråd som forklarer service vs fabrikk vs leverandør og deres injeksjonsbruk. Kompilerer svarene:
Services
Syntaks:
module.service( 'serviceName', function );
Resultat: Når du deklarerer serviceName som et injiserbart argument vil du få en forekomst av funksjonen. Med andre ord
new FunctionYouPassedToService()
.Factories
Syntaks:
module.factory( 'factoryName', function );
Resultat: Når du deklarerer factoryName som et injiserbart argument, vil du få verdien som returneres ved å påkalle funksjonsreferansen som sendes til module.factory.
Tilbydere
Syntaks:
module.provider( 'providerName', function );
Resultat: Når du deklarerer providerName som et injiserbart argument vil du få
(new ProviderFunction()).$get()
. Konstruktørfunksjonen instansieres før $get-metoden kalles -ProviderFunction
er funksjonsreferansen som sendes til module.provider.Providers har den fordelen at de kan konfigureres under modulkonfigurasjonsfasen.
Se her for den medfølgende koden.
Her er en god ytterligere forklaring av Misko:
I dette tilfellet returnerer injektoren ganske enkelt verdien som den er. Men hva om du vil beregne verdien? Bruk da en fabrikk
Så
factory
er en funksjon som er ansvarlig for å skape verdien. Legg merke til at factory-funksjonen kan be om andre avhengigheter.Men hva om du vil være mer OO og ha en klasse som heter Greeter?
For å instansiere må du da skrive
Deretter kan vi be om 'greeter' i kontrolleren slik
Men det er altfor omstendelig. En kortere måte å skrive dette på ville være
provider.service('greeter', Greeter);
Men hva om vi ønsket å konfigurere
Greeter
klasse før injeksjon? Da kunne vi skriveDa kan vi gjøre dette:
Som en side bemerkning er
service
,factory
ogvalue
alle avledet fra provider.[JS Fiddle Demo][1]
" Hello world " eksempel med
factory
/service
/provider
:Jeg la merke til noe interessant da jeg lekte med leverandører.
Synligheten av injeksjoner er annerledes for leverandører enn for tjenester og fabrikker. Hvis du erklærer en AngularJS "konstant" (for eksempel
myApp.constant('a', 'Robert');
), kan du injisere den i tjenester, fabrikker og leverandører.Men hvis du erklærer en AngularJS "verdi" (for eksempel.,
myApp.value('b', {name: 'Jones'});
), kan du injisere den i tjenester og fabrikker, men IKKE i leverandøropprettingsfunksjonen. Du kan imidlertid injisere den i$get
-funksjonen som du definerer for leverandøren din. Dette er nevnt i AngularJS-dokumentasjonen, men det er lett å overse. Du finner det på %provide-siden i avsnittene om verdi- og konstantmetoder.http://jsfiddle.net/R2Frv/1/