Meer
AngularJS: Dienst vs aanbieder vs fabriek
Wat zijn de verschillen tussen een Service
, Provider
en Factory
in AngularJS?
3291
3
Wat zijn de verschillen tussen een Service
, Provider
en Factory
in AngularJS?
Van de AngularJS mailing list kreeg ik een geweldige thread die service vs factory vs provider en hun injectie gebruik uitlegt. Compileren van de antwoorden:
Services
Syntax:
module.service( 'serviceName', function );
Resultaat: Als je serviceName als injectable argument declareert krijg je een instantie van de functie. Met andere woorden
new FunctionYouPassedToService()
.Factories
Syntax:
module.factory( 'factoryName', function );
Resultaat: Wanneer je factoryName als een injecteerbaar argument declareert, krijg je de waarde die wordt geretourneerd door het aanroepen van de functieverwijzing die aan module.factory is doorgegeven.
Providers
Syntaxis:
module.provider( 'providerName', function );
Resultaat: Bij het declareren van providerName als een injecteerbaar argument krijg je
(new ProviderFunction()).$get()
. De constructor functie wordt geïnstantieerd voordat de $get methode wordt aangeroepen -ProviderFunction
is de functie referentie die wordt doorgegeven aan module.provider.Providers hebben het voordeel dat ze geconfigureerd kunnen worden tijdens de module configuratie fase.
Zie hier voor de meegeleverde code.
Hier's een geweldige verdere uitleg door Misko:
In dit geval geeft de injector gewoon de waarde terug zoals die is. Maar wat als je de waarde wilt berekenen? Gebruik dan een fabriek
Dus
factory
is een functie die verantwoordelijk is voor het creëren van de waarde. Merk op dat de factory functie kan vragen om andere afhankelijkheden.Maar wat als je meer OO wilt zijn en een klasse wilt hebben met de naam Greeter?
Dan zou je om te instantiëren moeten schrijven
Dan zouden we kunnen vragen om 'greeter' in controller zoals dit
Maar dat is veel te wijd. Een kortere manier om dit te schrijven zou zijn
provider.service('greeter', Greeter);
Maar wat als we de
Greeter
klasse willen configureren voor de injectie? Dan zouden we kunnen schrijvenDan kunnen we dit doen:
Terzijde:
service
,factory
, envalue
zijn allemaal afgeleid van provider.[JS Fiddle Demo][1]
" Hello world " voorbeeld met
factory
/service
/provider
:Ik merkte iets interessants op toen ik met providers speelde.
Zichtbaarheid van injectables is anders voor providers dan het is voor services en factories. Als je een AngularJS "constant" declareert (bijvoorbeeld,
myApp.constant('a', 'Robert');
), kun je het injecteren in services, factories, en providers.Maar als je een AngularJS "value" declareert (bijvoorbeeld,
myApp.value('b', {name: 'Jones'});
), dan kun je het injecteren in services en factories, maar NIET in de provider-creërende functie. Je kunt het echter wel injecteren in de$get
functie die je definieert voor je provider. Dit wordt vermeld in de AngularJS documentatie, maar het'is gemakkelijk te missen. Je kunt het vinden op de %provide pagina in de secties over de value en constant methods.http://jsfiddle.net/R2Frv/1/