Quelles sont les différences entre un Service
, Provider
et Factory
en AngularJS?
angularjs
dependency-injection
angularjs-service
angularjs-factory
angularjs-provider
Lior
la source
la source
service.factory
. Je ne voulais pas compliquer davantage ce sujet.services
,factories
etproviders
œuvres.Réponses:
De la liste de diffusion AngularJS, j'ai obtenu un fil étonnant qui explique le service vs l'usine vs le fournisseur et leur utilisation d'injection. Compilation des réponses:
Prestations de service
Syntaxe:
module.service( 'serviceName', function );
Résultat: Lorsque vous déclarez serviceName comme argument injectable, vous recevrez une instance de la fonction. En d'autres termes
new FunctionYouPassedToService()
.Des usines
Syntaxe:
module.factory( 'factoryName', function );
Résultat: Lorsque vous déclarez factoryName en tant qu'argument injectable, la valeur renvoyée vous sera fournie en invoquant la référence de fonction passée à module.factory .
Fournisseurs
Syntaxe:
module.provider( 'providerName', function );
Résultat: Lorsque vous déclarez providerName comme argument injectable, vous recevrez
(new ProviderFunction()).$get()
. La fonction constructeur est instanciée avant que la méthode $ get soit appelée -ProviderFunction
est la référence de fonction passée à module.provider.Les fournisseurs 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 supplémentaire de Misko:
Dans ce cas, l'injecteur renvoie simplement la valeur telle quelle. Mais que faire si vous voulez calculer la valeur? Utilisez ensuite une usine
Donc
factory
est de même d'une fonction qui est responsable de la création de valeur. Notez que la fonction d'usine peut demander d'autres dépendances.Mais que se passe-t-il si vous voulez être plus OO et avoir une classe appelée Greeter?
Ensuite, pour instancier, il faudrait écrire
Ensuite, nous pourrions demander «greeter» dans le contrôleur comme celui-ci
Mais c'est beaucoup trop verbeux. Une façon plus courte d'écrire ceci serait
provider.service('greeter', Greeter);
Mais que faire si nous voulions configurer la
Greeter
classe avant l'injection? Ensuite, nous pourrions écrireEnsuite, nous pouvons le faire:
Comme une note de côté,
service
,factory
etvalue
sont tous dérivés du fournisseur.la source
toEqual
et ce qu'ellesgreeter.Greet
sont. Pourquoi ne pas utiliser quelque chose d'un peu plus réel et relatable?JS Fiddle Demo
Exemple "Hello world" avec
factory
/service
/provider
:la source
this
change pas de contexte dans la$get
fonction? - vous ne faites plus référence au fournisseur instancié dans cette fonction.this
ne change pas de contexte, en fait, car ce qui est appelé estnew Provider()
. $ Get (), oùProvider
est la fonction qui est passéeapp.provider
. C'est-à-dire qu'on l'$get()
appelle comme méthode sur le construitProvider
, donc onthis
se référeraProvider
comme le suggère l'exemple.Unknown provider: helloWorldProvider <- helloWorld
en exécutant ceci localement? Commentant, même erreur pour les 2 autres exemples. Existe-t-il une configuration de fournisseur cachée? (Angular 1.0.8) - Trouvé: stackoverflow.com/questions/12339272/…TL; DR
1) Lorsque vous utilisez une usine, vous créez un objet, lui ajoutez des propriétés, puis retournez ce même objet. Lorsque vous transmettez cette usine à votre contrôleur, ces propriétés sur l'objet seront désormais disponibles dans ce contrôleur via votre usine.
2) Lorsque vous utilisez le service , AngularJS l'instancie dans les coulisses avec le «nouveau» mot clé. Pour cette raison, vous ajouterez des propriétés à «ceci» et le service renverra «ceci». Lorsque vous transmettez le service à votre contrôleur, ces propriétés sur «ceci» seront désormais disponibles sur ce contrôleur via votre service.
3) Les fournisseurs sont le seul service que vous pouvez passer dans votre fonction .config (). Utilisez un fournisseur lorsque vous souhaitez fournir une configuration à l'échelle du module pour votre objet de service avant de le rendre disponible.
Non TL; DR
1) Les
usines d' usine sont le moyen le plus utilisé pour créer et configurer un service. Il n'y a vraiment pas beaucoup plus que ce que le TL; DR a dit. Il vous suffit de créer un objet, d'y ajouter des propriétés, puis de renvoyer ce même objet. Ensuite, lorsque vous passez l'usine dans votre contrôleur, ces propriétés sur l'objet seront désormais disponibles dans ce contrôleur via votre usine. Un exemple plus détaillé est présenté ci-dessous.
Maintenant, quelles que soient les propriétés que nous attachons au «service», nous serons disponibles lorsque nous passerons «myFactory» dans notre contrôleur.
Ajoutons maintenant quelques variables «privées» à notre fonction de rappel. Celles-ci ne seront pas directement accessibles depuis le contrôleur, mais nous finirons par mettre en place des méthodes getter / setter sur 'service' pour pouvoir modifier ces variables 'privées' si nécessaire.
Ici, vous remarquerez que nous n'attachons pas ces variables / fonctions au «service». Nous les créons simplement pour les utiliser ou les modifier ultérieurement.
Maintenant que nos variables et fonctions auxiliaires / privées sont en place, ajoutons quelques propriétés à l'objet «service». Tout ce que nous mettons sur «service» peut être directement utilisé à l'intérieur du contrôleur dans lequel nous passons «myFactory».
Nous allons créer des méthodes setArtist et getArtist qui renvoient ou définissent simplement l'artiste. Nous allons également créer une méthode qui appellera l'API iTunes avec notre URL créée. Cette méthode va retourner une promesse qui se réalisera une fois que les données seront revenues de l'API iTunes. Si vous n'avez pas beaucoup d'expérience dans l'utilisation des promesses dans AngularJS, je vous recommande fortement de les approfondir.
Ci-dessous, setArtist accepte un artiste et vous permet de définir l'artiste. getArtist renvoie l'artiste. callItunes appelle d'abord makeUrl () afin de construire l'URL que nous utiliserons avec notre requête $ http. Ensuite, il configure un objet de promesse, fait une demande $ http avec notre URL finale, puis parce que $ http renvoie une promesse, nous sommes en mesure d'appeler .success ou .error après notre demande. Nous résolvons ensuite notre promesse avec les données iTunes, ou nous la rejetons avec un message disant «Il y a eu une erreur».
Maintenant, notre usine est terminée. Nous pouvons désormais injecter «myFactory» dans n'importe quel contrôleur et nous pourrons ensuite appeler nos méthodes que nous avons attachées à notre objet de service (setArtist, getArtist et callItunes).
Dans le contrôleur ci-dessus, nous injectons dans le service «myFactory». Nous définissons ensuite les propriétés de notre objet $ scope avec les données de «myFactory». Le seul code délicat ci-dessus est si vous n'avez jamais traité de promesses auparavant. Parce que callItunes renvoie une promesse, nous sommes en mesure d'utiliser la méthode .then () et de définir $ scope.data.artistData uniquement une fois que notre promesse est remplie avec les données iTunes. Vous remarquerez que notre contrôleur est très «fin» (c'est une bonne pratique de codage). Toutes nos données logiques et persistantes se trouvent dans notre service, pas dans notre contrôleur.
2) Service
La chose la plus importante à savoir lors de la création d'un service est peut-être qu'il est instancié avec le «nouveau» mot clé. Pour vous, gourous de JavaScript, cela devrait vous donner une grande idée de la nature du code. Pour ceux d'entre vous qui ont peu d'expérience en JavaScript ou pour ceux qui ne connaissent pas trop ce que fait le `` nouveau '' mot clé, passons en revue certains principes fondamentaux de JavaScript qui nous aideront éventuellement à comprendre la nature d'un service.
Pour vraiment voir les changements qui se produisent lorsque vous appelez une fonction avec le mot-clé `` nouveau '', créons une fonction et appelez-la avec le mot clé `` nouveau '', puis montrons ce que fait l'interpréteur lorsqu'il voit le mot clé `` nouveau ''. Les résultats finaux seront les mêmes.
Créons d'abord notre constructeur.
Il s'agit d'une fonction constructeur JavaScript typique. Désormais, chaque fois que nous invoquerons la fonction Person à l'aide du mot-clé 'new', 'this' sera lié à l'objet nouvellement créé.
Ajoutons maintenant une méthode sur le prototype de notre Person afin qu'elle soit disponible sur chaque instance de notre 'classe' Person.
Maintenant, comme nous avons placé la fonction sayName sur le prototype, chaque instance de Person pourra appeler la fonction sayName afin d'alerter le nom de cette instance.
Maintenant que nous avons notre fonction constructeur Person et notre fonction sayName sur son prototype, créons en fait une instance de Person puis appelons la fonction sayName.
Donc, tous ensemble, le code pour créer un constructeur Person, ajouter une fonction à son prototype, créer une instance Person, puis appeler la fonction sur son prototype ressemble à ceci.
Voyons maintenant ce qui se passe réellement lorsque vous utilisez le «nouveau» mot clé en JavaScript. La première chose que vous devriez remarquer est qu'après avoir utilisé 'new' dans notre exemple, nous pouvons appeler une méthode (sayName) sur 'tyler' comme si c'était un objet - c'est parce que c'est le cas. Donc, tout d'abord, nous savons que notre constructeur Person retourne un objet, que nous puissions le voir dans le code ou non. Deuxièmement, nous savons que parce que notre fonction sayName est située sur le prototype et non directement sur l'instance Person, l'objet renvoyé par la fonction Person doit être délégué à son prototype en cas d'échec des recherches. En termes plus simples, lorsque nous appelons tyler.sayName (), l'interpréteur dit «OK, je vais regarder l'objet 'tyler' que nous venons de créer, localiser la fonction sayName, puis l'appeler. Attendez une minute, je ne le vois pas ici - tout ce que je vois c'est le nom et l'âge, permettez-moi de vérifier le prototype. Ouais, on dirait que c'est sur le prototype, permettez-moi de l'appeler. ”.
Vous trouverez ci-dessous un code permettant de savoir ce que le «nouveau» mot clé fait réellement en JavaScript. Il s'agit essentiellement d'un exemple de code du paragraphe ci-dessus. J'ai mis la «vue interprète» ou la façon dont l'interprète voit le code à l'intérieur des notes.
Ayant maintenant cette connaissance de ce que le «nouveau» mot clé fait vraiment en JavaScript, la création d'un service dans AngularJS devrait être plus facile à comprendre.
La chose la plus importante à comprendre lors de la création d'un service est de savoir que les services sont instanciés avec le «nouveau» mot clé. En combinant ces connaissances avec nos exemples ci-dessus, vous devez maintenant reconnaître que vous attacherez vos propriétés et méthodes directement à «ceci» qui sera ensuite renvoyé par le service lui-même. Jetons un coup d'oeil à cela en action.
Contrairement à ce que nous avons fait à l'origine avec l'exemple Factory, nous n'avons pas besoin de créer un objet puis de le renvoyer parce que, comme mentionné plusieurs fois auparavant, nous avons utilisé le mot-clé 'new' pour que l'interpréteur crée cet objet, le déléguer à c'est un prototype, puis retournez-le pour nous sans que nous ayons à faire le travail.
Tout d'abord, créons notre fonction «privée» et d'assistance. Cela devrait sembler très familier puisque nous avons fait exactement la même chose avec notre usine. Je ne vais pas expliquer ce que fait chaque ligne ici parce que je l'ai fait dans l'exemple d'usine, si vous êtes confus, relisez l'exemple d'usine.
Maintenant, nous allons attacher toutes nos méthodes qui seront disponibles dans notre contrôleur à «ceci».
Maintenant, tout comme dans notre usine, setArtist, getArtist et callItunes seront disponibles dans le contrôleur dans lequel nous transmettons myService. Voici le contrôleur myService (qui est presque exactement le même que notre contrôleur d'usine).
Comme je l'ai mentionné précédemment, une fois que vous comprenez vraiment ce que le «nouveau» fait, les services sont presque identiques aux usines d'AngularJS.
3) Fournisseur
La principale chose à retenir à propos des fournisseurs est qu'ils sont le seul service que vous pouvez passer dans la partie app.config de votre application. Cela est extrêmement important si vous devez modifier une partie de votre objet de service avant qu'il ne soit disponible partout ailleurs dans votre application. Bien que très similaire aux services / usines, il y a quelques différences dont nous discuterons.
Nous avons d'abord configuré notre fournisseur de la même manière que nous l'avons fait avec notre service et notre usine. Les variables ci-dessous sont notre fonction «privée» et d'assistance.
* Encore une fois, si une partie du code ci-dessus prête à confusion, consultez la section Usine où j'explique ce que tout cela fait plus de détails.
Vous pouvez considérer les fournisseurs comme ayant trois sections. La première section concerne les variables / fonctions «privées» qui seront modifiées / définies plus tard (voir ci-dessus). La deuxième section est les variables / fonctions qui seront disponibles dans votre fonction app.config et sont donc disponibles pour être modifiées avant d'être disponibles ailleurs (également indiqué ci-dessus). Il est important de noter que ces variables doivent être attachées au mot-clé «this». Dans notre exemple, seul 'thingFromConfig' sera disponible pour être modifié dans app.config. La troisième section (illustrée ci-dessous) comprend toutes les variables / fonctions qui seront disponibles dans votre contrôleur lorsque vous passerez le service «myProvider» à ce contrôleur spécifique.
Lors de la création d'un service avec Provider, les seules propriétés / méthodes qui seront disponibles dans votre contrôleur sont les propriétés / méthodes renvoyées par la fonction $ get (). Le code ci-dessous met $ get sur 'this' (qui, nous le savons, sera éventuellement renvoyé par cette fonction). Maintenant, cette fonction $ get renvoie toutes les méthodes / propriétés que nous voulons être disponibles dans le contrôleur. Voici un exemple de code.
Maintenant, le code complet du fournisseur ressemble à ceci
Maintenant, tout comme dans notre usine et notre service, setArtist, getArtist et callItunes seront disponibles dans le contrôleur dans lequel nous transmettons myProvider. Voici le contrôleur myProvider (qui est presque exactement le même que notre contrôleur d'usine / service).
Comme mentionné précédemment, l'intérêt de créer un service avec Provider est de pouvoir modifier certaines variables via la fonction app.config avant que l'objet final ne soit transmis au reste de l'application. Voyons un exemple de cela.
Maintenant, vous pouvez voir comment 'thingFromConfig' est une chaîne vide dans notre fournisseur, mais quand cela apparaîtra dans le DOM, ce sera 'Cette phrase a été définie ...'.
la source
Tous les services sont des singletons ; ils sont instanciés une fois par application. Ils peuvent être de n'importe quel type , qu'il s'agisse d'une fonction primitive, d'un littéral d'objet, ou même d'une instance d'un type personnalisé.
Le
value
,factory
,service
,constant
, et lesprovider
méthodes sont tous les fournisseurs. Ils enseignent à l'injecteur comment instancier les services.decorator
.la source
Comprendre l'usine, le service et le fournisseur AngularJS
Tous ces éléments sont utilisés pour partager des objets singleton réutilisables. Il permet de partager du code réutilisable sur votre application / divers composants / modules.
Usine
Une fabrique est une fonction où vous pouvez manipuler / ajouter de la logique avant de créer un objet, puis l'objet nouvellement créé est renvoyé.
Usage
Il peut s'agir simplement d'une collection de fonctions comme une classe. Par conséquent, il peut être instancié dans différents contrôleurs lorsque vous l'injectez dans vos fonctions contrôleur / usine / directive. Il n'est instancié qu'une seule fois par application.
Un service
Tout en regardant les services, pensez au prototype de la baie. Un service est une fonction qui instancie un nouvel objet à l'aide du mot-clé 'new'. Vous pouvez ajouter des propriétés et des fonctions à un objet de service à l'aide du
this
mot clé. Contrairement à une fabrique, elle ne retourne rien (elle retourne un objet qui contient des méthodes / propriétés).Usage
Utilisez-le lorsque vous devez partager un seul objet dans l'application. Par exemple, les détails de l'utilisateur authentifié, les méthodes / données partageables, les fonctions utilitaires, etc.
Fournisseur
Un fournisseur est utilisé pour créer un objet de service configurable. Vous pouvez configurer le paramètre de service à partir de la fonction de configuration. Il renvoie une valeur en utilisant la
$get()
fonction. La$get
fonction s'exécute sur la phase d'exécution en angulaire.Usage
Lorsque vous devez fournir une configuration par module pour votre objet de service avant de le rendre disponible, par exemple. supposons que vous souhaitiez définir l'URL de votre API en fonction de votre environnement
dev
,stage
ouprod
J'espère que cela a clarifié votre compréhension de l' usine, du service et du fournisseur .
la source
only when you want to expose an API for application-wide configuration that must be made before the application starts. This is usually interesting only for reusable services whose behavior might need to vary slightly between applications
, donc cela ne semble pas possible, non?Pour moi, la révélation est venue quand j'ai réalisé qu'ils fonctionnent tous de la même manière: en exécutant quelque chose une fois , en stockant la valeur qu'ils obtiennent, puis en crachant cette même valeur stockée lorsqu'ils sont référencés via l' injection de dépendances .
Disons que nous avons:
La différence entre les trois est que:
a
La valeur stockée provient de l'exécutionfn
.b
La valeur stockée vient denew
ingfn
.c
La valeur stockée provient d'abord de l'obtention d'une instance parnew
ingfn
, puis de l'exécution d'une$get
méthode de l'instance.Ce qui signifie qu'il y a quelque chose comme un objet cache dans AngularJS, dont la valeur de chaque injection n'est affectée qu'une seule fois, lors de leur première injection, et où:
C'est pourquoi nous utilisons des
this
services et définissons unthis.$get
fournisseur.la source
factory
art. La seule raison pour laquelleservice
il existe des langages comme CoffeeScript, TypeScript, ES6, etc., vous pouvez donc utiliser leur syntaxe de classe. Vous n'avez besoin deprovider
s que si votre module est utilisé dans plusieurs applications avec des paramètres différents en utilisantapp.config()
. Si votre service est un simple singleton ou est capable de créer des instances de quelque chose ne dépend que de votre implémentation.Service vs fournisseur vs usine:
J'essaie de rester simple. Il s'agit du concept de base de JavaScript.
Tout d'abord, parlons des services dans AngularJS!
Qu'est-ce que le service: dans AngularJS, servicen'est rien d'autre qu'un objet JavaScript singleton qui peut stocker des méthodes ou des propriétés utiles. Cet objet singleton est créé par base ngApp (application angulaire) et il est partagé entre tous les contrôleurs de l'application actuelle. Lorsque Angularjs instancie un objet de service, il enregistre cet objet de service avec un nom de service unique. Ainsi, chaque fois que nous avons besoin d'une instance de service, Angular recherche dans le registre ce nom de service et renvoie la référence à l'objet de service. Tels que nous pouvons invoquer la méthode, accéder aux propriétés, etc. sur l'objet de service. Vous pouvez vous demander si vous pouvez également mettre des propriétés, des méthodes sur l'objet de portée des contrôleurs! Alors pourquoi avez-vous besoin d'un objet de service? Les réponses sont les suivantes: les services sont partagés entre plusieurs contrôleurs. Si vous placez certaines propriétés / méthodes dans un objet de portée d'un contrôleur, elles ne seront disponibles que pour la portée actuelle.
Donc, s'il y a trois portées de contrôleur, que ce soit controllerA, controllerB et controllerC, toutes partageront la même instance de service.
Comment créer un service?
AngularJS propose différentes méthodes pour enregistrer un service. Ici, nous nous concentrerons sur trois méthodes: usine (..), service (..), fournisseur (..);
Utilisez ce lien pour la référence du code
Fonction d'usine:
Nous pouvons définir une fonction d'usine comme ci-dessous.
AngularJS fournit la méthode 'factory (' serviceName ', fnFactory)' qui prend deux paramètres, serviceName et une fonction JavaScript. Angular crée une instance de service en appelant la fonction fnFactory () comme ci-dessous.
La fonction passée peut définir un objet et renvoyer cet objet. AngularJS stocke simplement cette référence d'objet dans une variable qui est passée comme premier argument. Tout ce qui est renvoyé par fnFactory sera lié à serviceInstance. Au lieu de renvoyer un objet, nous pouvons également retourner une fonction, des valeurs, etc., tout ce que nous retournerons, sera disponible pour l'instance de service.
Exemple:
Fonction de service:
C'est une autre façon, nous pouvons enregistrer un service. La seule différence est la façon dont AngularJS essaie d'instancier l'objet de service. Cette fois, angular utilise le mot-clé 'new' et appelle la fonction constructeur quelque chose comme ci-dessous.
Dans la fonction constructeur, nous pouvons utiliser le mot clé «this» pour ajouter des propriétés / méthodes à l'objet de service. exemple:
Fonction fournisseur:
La fonction Provider () est un autre moyen de créer des services. Intéressons-nous à créer un service qui affiche simplement un message de bienvenue à l'utilisateur. Mais nous voulons également fournir une fonctionnalité permettant à l'utilisateur de définir son propre message d'accueil. En termes techniques, nous voulons créer des services configurables. Comment peut-on le faire ? Il doit y avoir un moyen, afin que l'application puisse passer leurs messages d'accueil personnalisés et Angularjs le rendrait disponible pour la fonction usine / constructeur qui crée notre instance de services. Dans un tel cas, la fonction provider () fait le travail. en utilisant la fonction provider (), nous pouvons créer des services configurables.
Nous pouvons créer des services configurables en utilisant la syntaxe du fournisseur comme indiqué ci-dessous.
Comment fonctionne la syntaxe du fournisseur en interne?
1.L'objet fournisseur est créé à l'aide de la fonction constructeur que nous avons définie dans notre fonction fournisseur.
2.La fonction que nous avons passée dans app.config (), est exécutée. C'est ce qu'on appelle la phase de configuration, et ici nous avons la possibilité de personnaliser notre service.
3.Enfin, l'instance de service est créée en appelant la méthode $ get de serviceProvider.
Exemple de code pour créer un service à l'aide de la syntaxe provide:
Démo de travail
Sommaire:
Factory utilise une fonction d'usine qui renvoie une instance de service. serviceInstance = fnFactory ();
Le service utilise une fonction constructeur et Angular invoque cette fonction constructeur en utilisant le mot clé 'new' pour créer l'instance de service. serviceInstance = new fnServiceConstructor ();
Le fournisseur définit une fonction providerConstructor, cette fonction providerConstructor définit une fonction d'usine $ get . Angular appelle $ get () pour créer l'objet de service. La syntaxe du fournisseur a l'avantage supplémentaire de configurer l'objet de service avant qu'il ne soit instancié. serviceInstance = $ get ();
la source
Comme l'ont souligné plusieurs personnes ici correctement, une usine, un fournisseur, un service et même une valeur et une constante sont des versions de la même chose. Vous pouvez disséquer le plus général
provider
en chacun d'eux. Ainsi:Voici l'article dont provient cette image:
http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/
la source
Usine
Vous donnez une fonction à AngularJS, AngularJS mettra en cache et injectera la valeur de retour lorsque l'usine sera demandée.
Exemple:
Usage:
Un service
Vous donnez une fonction à AngularJS, AngularJS appellera new pour l'instancier. C'est l'instance créée par AngularJS qui sera mise en cache et injectée lorsque le service sera demandé. Puisque new a été utilisé pour instancier le service, le mot - clé this est valide et fait référence à l'instance.
Exemple:
Usage:
Fournisseur
Vous donnez à AngularJS une fonction, et AngularJS appellera sa
$get
fonction. C'est la valeur de retour de la$get
fonction qui sera mise en cache et injectée lorsque le service sera demandé.Les fournisseurs vous permettent de configurer le fournisseur avant qu'AngularJS appelle la
$get
méthode pour obtenir l'injectable.Exemple:
Utilisation (comme injectable dans un contrôleur)
Utilisation (la configuration du fournisseur avant
$get
est appelée pour créer l'injectable)la source
J'ai remarqué quelque chose d'intéressant en jouant avec les fournisseurs.
La visibilité des injectables est différente pour les prestataires que pour les services et les usines. Si vous déclarez une «constante» AngularJS (par exemple,
myApp.constant('a', 'Robert');
), vous pouvez l'injecter dans les services, les usines 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 usines, mais PAS dans la fonction de création de fournisseur. Vous pouvez cependant l'injecter dans la$get
fonction que vous définissez pour votre fournisseur. Ceci est mentionné dans la documentation AngularJS, mais c'est facile à manquer. Vous pouvez le trouver sur la page% provide dans les sections sur la valeur et les méthodes constantes.http://jsfiddle.net/R2Frv/1/
la source
C'est une partie très déroutante pour les débutants et j'ai essayé de le clarifier en termes simples
Service AngularJS: est utilisé pour partager des fonctions utilitaires avec la référence de service dans le contrôleur. Le service est de nature singleton, donc pour un service, une seule instance est créée dans le navigateur et la même référence est utilisée tout au long de la page.
Dans le service, nous créons des noms de fonction en tant que propriété avec cet objet.
AngularJS Factory: le but de Factory est également le même que Service mais dans ce cas nous créons un nouvel objet et ajoutons des fonctions comme propriétés de cet objet et à la fin nous retournons cet objet.
Fournisseur AngularJS: le but de ceci est encore le même mais le fournisseur donne la sortie de sa fonction $ get.
La définition et l'utilisation de Service, Factory et Provider sont expliquées sur http://www.dotnetfunda.com/articles/show/3156/difference-between-angularjs-service-factory-and-provider
la source
Pour moi, la meilleure et la plus simple façon de comprendre la différence est:
Comment AngularJS instancie des composants particuliers (simplifié):
Ainsi, pour le service, ce qui devient le composant AngularJS est l'instance d'objet de la classe qui est représentée par la fonction de déclaration de service. Pour l'usine, c'est le résultat renvoyé par la fonction de déclaration d'usine. L'usine peut se comporter de la même manière que le service:
La façon la plus simple de penser est la suivante:
L'exemple de «classe» d'usine est fourni dans les commentaires, ainsi que la différence de fournisseur.
la source
new MyService()
ou quelque chose :)Ma clarification à ce sujet:
Fondamentalement, tous les types mentionnés (service, usine, fournisseur, etc.) ne font que créer et configurer des variables globales (qui sont bien sûr globales pour l'ensemble de l'application), tout comme les variables globales à l'ancienne.
Bien que les variables globales ne soient pas recommandées, l'utilisation réelle de ces variables globales est de fournir une injection de dépendance , en transmettant la variable au contrôleur approprié.
La création des valeurs des "variables globales" présente de nombreux niveaux de complications:
Ceci définit une constante réelle qui ne doit pas être modifiée pendant toute l'application, tout comme les constantes dans d'autres langues (ce qui manque à JavaScript).
Il s'agit d'une valeur ou d'un objet modifiable, et elle sert de variable globale, qui peut même être injectée lors de la création d'autres services ou usines (voir plus loin). Cependant, il doit s'agir d'une " valeur littérale ", ce qui signifie que l'on doit écrire la valeur réelle et ne peut utiliser aucune logique de calcul ou de programmation (en d'autres termes, 39 ou myText ou {prop: "value"} sont OK, mais 2 +2 ne l'est pas).
Une valeur plus générale, qui peut être calculée immédiatement. Il fonctionne en passant une fonction à AngularJS avec la logique nécessaire pour calculer la valeur et AngularJS l'exécute, et il enregistre la valeur de retour dans la variable nommée.
Notez qu'il est possible de renvoyer un objet (auquel cas il fonctionnera comme un service ) ou une fonction (qui sera enregistrée dans la variable en tant que fonction de rappel).
Un service est une version d' usine plus simplifiée qui n'est valide que lorsque la valeur est un objet, et il permet d'écrire toute logique directement dans la fonction (comme s'il s'agissait d'un constructeur), ainsi que de déclarer et d'accéder à les propriétés de l'objet à l'aide du mot - clé this .
Contrairement à un service qui est une version simplifiée de l' usine , un fournisseur est un moyen plus complexe mais plus flexible d'initialiser les variables "globales", la plus grande flexibilité étant l'option de définition de valeurs à partir de app.config.
Cela fonctionne comme l'utilisation d'une combinaison de service et de fournisseur , en passant au fournisseur une fonction qui a des propriétés déclarées à l'aide du mot - clé this , qui peut être utilisé à partir du
app.config
.Ensuite, il doit avoir une fonction $ .get distincte qui est exécutée par AngularJS après avoir défini les propriétés ci-dessus via le
app.config
fichier, et cette fonction $ .get se comporte exactement comme le usine ci-dessus, en ce que sa valeur de retour est utilisée pour initialiser les variables "globales".la source
Ma compréhension est très simple ci-dessous.
Usine: il vous suffit de créer un objet à l'intérieur de l'usine et de le renvoyer.
Un service:
Vous avez juste une fonction standard qui utilise ce mot-clé pour définir une fonction.
Fournisseur:
Il y a un
$get
objet que vous définissez et il peut être utilisé pour obtenir l'objet qui renvoie des données.la source
Résumé des documents angulaires :
Meilleures réponses de SO:
https://stackoverflow.com/a/26924234/165673 (<- BON) https://stackoverflow.com/a/27263882/165673
https://stackoverflow.com/a/16566144/165673
la source
Toutes les bonnes réponses déjà. Je voudrais ajouter quelques points supplémentaires sur le service et l' usine . Avec la différence entre service / usine. Et on peut aussi avoir des questions comme:
Commençons par la différence entre le service et l'usine:
Les deux sont des singletons : chaque fois qu'Angular les trouve comme dépendance pour la première fois, il crée une seule instance de service / usine. Une fois l'instance créée, la même instance est utilisée pour toujours.
Peut être utilisé pour modéliser un objet avec un comportement : ils peuvent tous deux avoir des méthodes, des variables d'état interne, etc. Bien que la façon dont vous écrivez ce code soit différente.
Prestations de service:
Un service est une fonction constructeur, et Angular l'instanciera en appelant new
yourServiceName()
. Cela signifie plusieurs choses.this
.new yourServiceName(
), il recevra l'this
objet avec toutes les propriétés que vous lui aurez attribuées.Exemple d'échantillon:
Soyez prudent avec
this
:Étant donné que le service construit est un objet, les méthodes qu'il contient peuvent s'y référer lorsqu'elles sont appelées:
Vous pourriez être tenté d'appeler
ScoreKeeper.setScore
dans une chaîne de promesses, par exemple si vous avez initialisé le score en le saisissant sur le serveur:$http.get('/score').then(ScoreKeeper.setScore).
le problème est que ceScoreKeeper.setScore
sera appelé avecthis
lié ànull
et vous obtiendrez des erreurs. La meilleure façon serait$http.get('/score').then(ScoreKeeper.setScore.bind(ScoreKeeper))
. Que vous choisissiez de l'utiliser ou non dans vos méthodes de service, faites attention à la façon dont vous les appelez.Renvoyer une valeur à partir d'un
Service
:En raison du fonctionnement des constructeurs JavaScript, si vous renvoyez une valeur complexe à
(i.e., an Object)
partir d'uneconstructor
fonction, l'appelant obtiendra cet objet au lieu de cette instance.Cela signifie que vous pouvez essentiellement copier-coller l'exemple d'usine par le bas, le remplacer
factory
parservice
, et cela fonctionnera:Ainsi, lorsque Angular construit votre service avec le nouveau MyService (), il obtiendra cet objet api au lieu de l'instance MyService.
C'est le comportement pour toutes les valeurs complexes (objets, fonctions) mais pas pour les types primitifs.
Des usines:
Une usine est une ancienne fonction qui renvoie une valeur. La valeur de retour est ce qui est injecté dans des choses qui dépendent de l'usine. Un modèle d'usine typique dans Angular consiste à renvoyer un objet avec des fonctions comme propriétés, comme ceci:
Réponses aux questions 1 et 2 ci-dessus:
la source
Une précision supplémentaire est que les usines peuvent créer des fonctions / primitives, contrairement aux services. Découvrez ce jsFiddle basé sur Epokk: http://jsfiddle.net/skeller88/PxdSP/1351/ .
La fabrique renvoie une fonction qui peut être invoquée:
La fabrique peut également renvoyer un objet avec une méthode qui peut être invoquée:
Le service renvoie un objet avec une méthode qui peut être invoquée:
Pour plus de détails, voir un article que j'ai écrit sur la différence: http://www.shanemkeller.com/tldr-services-vs-factories-in-angular/
la source
Il y a déjà de bonnes réponses, mais je veux juste partager celle-ci.
Tout d'abord: le fournisseur est le moyen / la recette pour créer un
service
(objet singleton) qui suppose être injecté par $ injector (comment AngulaJS traite le modèle IoC).Et Value, Factory, Service et Constant (4 voies) - le sucre syntaxique par rapport à la méthode Provider / recette.
Il y a une
Service vs Factory
partie a été couverte: https://www.youtube.com/watch?v=BLzNCkPn3aoLe service est avant tout un
new
mot clé qui, comme nous le savons, fait 4 choses:prototype
objetcontext
àthis
this
Et Factory est tout sur Factory Pattern - contient des fonctions qui renvoient des objets comme ce service.
Et cette vidéo simple / courte: couvre également le fournisseur : https://www.youtube.com/watch?v=HvTZbQ_hUZY (là vous pouvez voir comment ils vont de l'usine au fournisseur)
La recette du fournisseur est principalement utilisée dans la configuration de l'application, avant que l'application ne soit complètement démarrée / initialisée.
la source
Après avoir lu tous ces articles, cela a créé plus de confusion pour moi .. Mais tout est toujours utile .. enfin j'ai trouvé le tableau suivant qui donnera des informations avec une comparaison simple
Et pour les débutants, comprenez: - Cela peut ne pas corriger le cas d'utilisation, mais à un niveau élevé, c'est ce qui convient à ces trois.
Pour les scénarios de base, Factory & Service se comporte de la même manière.
la source
Voici du code de broilplate que j'ai trouvé comme modèle de code pour la fabrique d'objets dans AngularjS. J'ai utilisé un Car / CarFactory comme exemple pour illustrer. Permet un code d'implémentation simple dans le contrôleur.
Voici un exemple plus simple. J'utilise quelques bibliothèques tierces qui attendent un objet "Position" exposant la latitude et la longitude, mais via différentes propriétés d'objet. Je ne voulais pas pirater le code du fournisseur, j'ai donc ajusté les objets "Position" que je faisais circuler.
;
la source
En utilisant comme référence cette page et la documentation (qui semble s'être considérablement améliorée depuis la dernière fois que j'ai regardé), j'ai mis en place la démo du monde réel (-ish) qui utilise 4 des 5 versions du fournisseur; Valeur, constante, usine et fournisseur complet.
HTML:
app
Démo de travail .
la source
Cette réponse aborde le sujet / la question
comment Factory, Service et Constant - ne sont-ils que du sucre syntaxique en plus d'une recette de fournisseur?
OU
comment l'usine, le service et les fournisseurs sont simailar en interne
essentiellement ce qui se passe est
Lorsque vous créez un
factory()
il définit lefunction
second argument que vous avez fourni au fournisseur$get
et que vous le renvoyez (provider(name, {$get:factoryFn })
), tout ce que vous obtenez estprovider
mais il n'y a pas de propriété / méthode autre que$get
celle-ciprovider
(signifie que vous ne pouvez pas configurer cela)Code source de l'usine
Lorsque vous faites un
service()
retour, vous fournissez une fabrique () avec unfunction
qui injecte leconstructor
(retourne l'instance du constructeur que vous avez fourni dans votre service) et le retourneCode source du service
Donc, fondamentalement, dans les deux cas, vous obtenez finalement un fournisseur $ get défini sur la fonction que vous avez fournie, mais vous pouvez donner quelque chose de plus que $ get comme vous pouvez initialement le fournir dans provider () pour le bloc de configuration
la source
Je connais beaucoup d'excellentes réponses, mais je dois partager mon expérience de l'utilisation de
1.
service
pour la plupart des cas de défaut2.
factory
utilisé pour créer le service de cette instance spécifiqueet en utilisant:
la source
Un peu tard pour la fête. Mais je pensais que cela était plus utile pour ceux qui aimeraient apprendre (ou avoir de la clarté) sur le développement de services personnalisés Angular JS en utilisant les méthodologies d'usine, de service et de fournisseur.
Je suis tombé sur cette vidéo qui explique clairement les méthodologies d'usine, de service et de fournisseur pour développer AngularJS Custom Services:
https://www.youtube.com/watch?v=oUXku28ex-M
Code source: http://www.techcbt.com/Post/353/Angular-JS-basics/how-to-develop-angularjs-custom-service
Le code affiché ici est copié directement à partir de la source ci-dessus, pour le bénéfice des lecteurs.
Le code du service personnalisé basé en usine est le suivant (qui va avec les versions sync et async avec l'appel du service http):
Le code de la méthodologie «service» pour les services personnalisés (il est assez similaire à «usine», mais différent du point de vue de la syntaxe):
Le code de la méthodologie «fournisseur» pour les services personnalisés (cela est nécessaire si vous souhaitez développer un service qui pourrait être configuré):
Enfin l'interface utilisateur qui fonctionne avec l'un des services ci-dessus:
la source
Juste pour clarifier les choses, à partir de la source AngularJS, vous pouvez voir qu'un service appelle simplement la fonction d'usine qui à son tour appelle la fonction de fournisseur:
la source
Discutons des trois façons de gérer la logique métier dans AngularJS de manière simple: ( Inspiré par le cours Coursera AngularJS de Yaakov )
SERVICE :
Syntaxe:
app.js
index.html
Caractéristiques du service:
USINE
Voyons d'abord la syntaxe:
app.js :
Maintenant, en utilisant les deux ci-dessus dans le contrôleur:
Caractéristiques de l'usine:
.service()
méthode est une usine qui produit toujours le même type de service, qui est un singleton, et sans aucun moyen facile de configurer son comportement. Cette.service()
méthode est généralement utilisée comme raccourci pour quelque chose qui ne nécessite aucune configuration.FOURNISSEUR
Revoyons d'abord la syntaxe:
Caractéristiques du fournisseur:
.service
ou l' autre des.factory
méthodes.$get
est une fonction directement attachée à l'instance de fournisseur. Cette fonction est une fonction d' usine . En d'autres termes, c'est comme celui que nous utilisons pour fournir à la.factory
méthode. Dans cette fonction, nous créons notre propre service. Cette$get
propriété, qui est une fonction, est ce qui fait du fournisseur un fournisseur . AngularJS s'attend à ce que le fournisseur ait une propriété $ get dont la valeur est une fonction qu'Angular traitera comme une fonction d'usine. Mais ce qui rend cette configuration de fournisseur très spéciale, c'est le fait que nous pouvons fournir unconfig
objet à l'intérieur du fournisseur de services, et cela vient généralement avec des valeurs par défaut que nous pouvons remplacer plus tard à l'étape, où nous pouvons configurer l'application entière.la source
Usine: l'usine dans laquelle vous créez un objet à l'intérieur de l'usine et le renvoyez.
service: le service dont vous venez de disposer d'une fonction standard qui utilise le mot-clé this pour définir la fonction.
provider: Le fournisseur il y a un $ get vous définissez et il peut être utilisé pour obtenir l'objet qui retourne les données.
la source
Essentiellement, le fournisseur, l'usine et le service sont tous des services. Une Factory est un cas particulier de Service lorsque vous n'avez besoin que d'une fonction $ get (), vous permettant de l'écrire avec moins de code.
Les principales différences entre les services, les usines et les fournisseurs sont leurs complexités. Les services sont la forme la plus simple, les usines sont un peu plus robustes et les fournisseurs sont configurables au moment de l'exécution.
Voici un résumé de l'utilisation de chacun:
Usine : La valeur que vous fournissez doit être calculée sur la base d'autres données.
Service : vous renvoyez un objet avec des méthodes.
Fournisseur : Vous voulez pouvoir configurer, pendant la phase de configuration, l'objet qui va être créé avant sa création. Utilisez le fournisseur principalement dans la configuration de l'application, avant que l'application ne soit complètement initialisée.
la source
Les services sont des objets singleton qui sont créés lorsque cela est nécessaire et qui ne sont jamais nettoyés jusqu'à la fin du cycle de vie de l'application (lorsque le navigateur est fermé). Les contrôleurs sont détruits et nettoyés lorsqu'ils ne sont plus nécessaires.
2.La façon la plus simple de créer un service est d'utiliser la méthode factory (). La méthode factory () nous permet de définir un service en renvoyant un objet qui contient des fonctions de service et des données de service. La fonction de définition de service est l'endroit où nous plaçons nos services injectables, tels que $ http et $ q. Ex:
Utiliser l'usine () dans notre application
Il est facile d'utiliser l'usine dans notre application car nous pouvons simplement l'injecter là où nous en avons besoin au moment de l'exécution.
la source
Le sucre syntaxique est la différence . Seul le fournisseur est nécessaire. Ou en d'autres termes, seul le fournisseur est le véritable angulaire, tous les autres sont dérivés (pour réduire le code). Il existe également une version simple, appelée Value () qui ne renvoie que la valeur, sans calcul ni fonction. Même la valeur est dérivée du fournisseur!
Alors pourquoi de telles complications, pourquoi ne pouvons-nous pas simplement utiliser le fournisseur et oublier tout le reste? Il est censé nous aider à écrire du code facilement et à mieux communiquer. Et la réponse toungue-in-cheek serait, plus il devient complexe, meilleure sera la vente d'un cadre.
L'injection angulaire nous donne le premier indice pour arriver à cette conclusion.
"$ injector est utilisé pour récupérer les instances d'objets définies par le fournisseur " pas le service, pas la fabrique mais le fournisseur.
Et une meilleure réponse serait la suivante: "Un service angulaire est créé par une fabrique de services. Ces fabriques de services sont des fonctions qui, à leur tour, sont créées par un fournisseur de services. Les fournisseurs de services sont des fonctions de constructeur. Lorsqu'ils sont instanciés, ils doivent contenir une propriété appelé $ get, qui contient la fonction de fabrique de services. "
Donc fournisseur principal et injecteur et tout se mettra en place :). Et cela devient intéressant dans Typescript lorsque $ get peut être implémenté dans un fournisseur en héritant de IServiceProvider.
la source