Détails
AngularJS : service, fournisseur et usine
Quelles sont les différences entre un Service
, un Provider
et un Factory
dans AngularJS ?
3291
3
Sur la liste de diffusion AngularJS, j'ai obtenu [un fil de discussion étonnant][1] qui explique les notions de service, de fabrique et de fournisseur, ainsi que leur utilisation en matière d'injection. Je compile les réponses :
Services
Syntaxe :
module.service( 'serviceName', function );
Résultat : En déclarant serviceName comme un argument injectable on vous fournira une instance de la fonction. En d'autres termes
new FunctionYouPassedToService()
.Factories
Syntaxe :
module.factory('factoryName', function );
Résultat : En déclarant factoryName en tant qu'argument injectable, vous obtiendrez la valeur qui est retournée en invoquant la référence de la fonction passée à module.factory.
Providers
Syntaxe :
module.provider('providerName', function );
Résultat : Lorsque vous déclarez providerName en tant qu'argument injectable vous aurez à votre disposition
(new ProviderFunction()).$get()
. La fonction constructeur est instanciée avant que la méthode $get ne soit appelée -ProviderFunction
est la référence de la fonction passée à module.provider.Les Providers ont l'avantage de pouvoir être configurés pendant la phase de configuration du module.
Voir ici pour le code fourni.
Voici une excellente explication complémentaire par Misko :
Dans ce cas, l'injecteur renvoie simplement la valeur telle quelle. Mais que faire si vous voulez calculer la valeur ? Utilisez alors une fabrique
Donc
factory
est une fonction qui est responsable de la création de la valeur. Remarquez que la fonction factory peut demander d'autres dépendances.Mais que faire si vous voulez être plus OO et avoir une classe appelée Greeter ?
Pour l'instancier, il faudrait alors écrire
Ensuite, nous pourrions demander 'greeter' dans le contrôleur comme ceci
Mais c'est beaucoup trop long. Une façon plus courte d'écrire ceci serait `provider.service('greeter', Greeter);``
Mais que faire si nous voulons configurer la classe
Greeter
avant l'injection ? Nous pourrions alors écrireAlors nous pouvons faire ceci :
En passant,
service
,factory
, etvalue
sont tous dérivés de provider.[1] : https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/HuZsOsMvKv4J
[JS Fiddle Demo] [1]
" Hello world " exemple avec
factory
/service
/provider
:[1] : http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/
J'ai remarqué quelque chose d'intéressant en jouant avec les fournisseurs.
La visibilité des injectables est différente pour les providers que pour les services et les factories. Si vous déclarez une "constante" AngularJS (par exemple,
myApp.constant('a', 'Robert');
), vous pouvez l'injecter dans les services, les fabriques et les fournisseurs.Mais si vous déclarez une "valeur" AngularJS (par exemple,
myApp.value('b', {name : 'Jones'});
), vous pouvez l'injecter dans les services et les fabriques, mais PAS dans la fonction de création de fournisseur. Vous pouvez toutefois l'injecter dans la fonction$get
que vous définissez pour votre fournisseur. Ceci est mentionné dans la documentation d'AngularJS, mais il est facile de le manquer. Vous pouvez le trouver sur la page %provide dans les sections sur les méthodes value et constant.http://jsfiddle.net/R2Frv/1/