Si je comprends bien, à l'intérieur d'une usine, je retourne un objet qui est injecté dans un contrôleur. Lorsque je suis à l'intérieur d'un service, je traite l'objet en utilisant this
et en ne retournant rien.
J'étais sous l'hypothèse qu'un service a toujours été un singleton et qu'un nouvel objet d'usine est injecté dans chaque contrôleur. Cependant, il s'avère qu'un objet d'usine est aussi un singleton?
Exemple de code pour démontrer:
var factories = angular.module('app.factories', []);
var app = angular.module('app', ['ngResource', 'app.factories']);
factories.factory('User', function () {
return {
first: 'John',
last: 'Doe'
};
});
app.controller('ACtrl', function($scope, User) {
$scope.user = User;
});
app.controller('BCtrl', function($scope, User) {
$scope.user = User;
});
Lors d'un changement user.first
dans ACtrl
il se trouve que user.first
dans BCtrl
est également modifiée, par exemple , User
est un singleton?
Mon hypothèse était qu'une nouvelle instance a été injectée dans un contrôleur avec une usine?
Réponses:
Tous les services angulaires sont des singletons :
Documents (voir Services en tant que singletons ): https://docs.angularjs.org/guide/services
Fondamentalement, la différence entre le service et l'usine est la suivante:
Découvrez cette présentation sur $ provide: http://slides.wesalvaro.com/20121113/#/
Ces diapositives ont été utilisées dans l'un des Meetups AngularJs: http://blog.angularjs.org/2012/11/more-angularjs-meetup-videos.html
la source
new
.Pour moi, la révélation est venue quand je me rends compte 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épendance.
Disons que nous avons:
La différence entre les trois est que:
a
La valeur stockée provient de l'exécutionfn
, en d'autres termes:fn()
b
La valeur stockée provient denew
ingfn
, en d'autres termes:new fn()
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'instancece qui signifie qu'il y a quelque chose comme un objet cache à l'intérieur angulaire, dont la valeur de chaque injection n'est assigné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.J'espère que cela t'aides.
la source
exemple en direct
exemple "bonjour le monde"
avec
factory
/service
/provider
:la source
Il existe également un moyen de renvoyer une fonction constructeur afin que vous puissiez retourner des classes pouvant être renouvelées dans des usines, comme ceci:
Vous pouvez donc le faire dans un contrôleur, qui utilise MyObjectWithParam:
Voir ici l'exemple complet:
http://plnkr.co/edit/GKnhIN?p=preview
Et voici les pages du groupe Google, où il a été discuté:
https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/b8hdPskxZXsJ
la source
App.factory('MyObjectWithParam', ['$injector', function ($injector) { return function(name) { return $injector.instantiate(MyObjectWithParam,{ name: name }); }; }]);
En savoir plus ici: docs.angularjs.org/tutorial/step_05.service
place?.factory
par opposition à.service
?new Car('BMW')
etnew Car('Ford')
et ils ne partagent pas les mêmes variables et tout.Voici les principales différences:
Prestations de service
Syntaxe:
module.service( 'serviceName', function );
Résultat: Lorsque vous déclarez serviceName comme argument injectable, vous recevrez l' instance d'une fonction passée à
module.service
.Utilisation: pourrait être utile pour partager des fonctions utilitaires qu'il est utile d'invoquer en ajoutant simplement () à la référence de fonction injectée. Peut également être exécuté avec
injectedArg.call( this )
ou similaire.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
.Utilisation: pourrait être utile pour renvoyer une fonction «classe» qui peut ensuite être renouvelée pour créer des instances.
Vérifiez également la documentation AngularJS et une question similaire sur stackoverflow confus à propos du service par rapport à l'usine .
Voici un exemple d'utilisation de services et d'usine . En savoir plus sur le service AngularJS par rapport à l'usine .
la source
Pour ajouter à la première réponse, je pense que .service () est destiné aux personnes qui ont écrit leur code dans un style plus orienté objet (C # / Java) (en utilisant ce mot-clé et en instanciant l'objet via la fonction prototype / constructeur).
Factory est destiné aux développeurs qui écrivent du code plus naturel pour le style de codage javascript / fonctionnel.
Jetez un œil au code source de la méthode .service et .factory dans angular.js - en interne, ils appellent tous la méthode du fournisseur:
la source
Très simplement:
.service - la fonction enregistrée sera invoquée en tant que constructeur (aka 'newed')
.factory - la fonction enregistrée sera invoquée comme une fonction simple
Les deux sont invoqués une fois, ce qui crée un objet singleton qui est injecté dans d'autres composants de votre application.
la source
Tous les fournisseurs fonctionnent de la même manière. Les différentes méthodes
service
,factory
,provider
juste vous permettent de faire la même chose en moins de code.PS Il y a aussi
value
etconstant
.Chaque cas spécial dans la chaîne commençant par
provider
et se terminant parvalue
a une limitation supplémentaire. Donc, pour décider entre eux, vous devez vous demander lequel vous permet d'accomplir ce que vous voulez avec moins de code.Voici une photo qui vous montre ce que je veux dire:
Vous pouvez un guide de ventilation et de référence sur le blog où j'ai obtenu cette image:
http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/
la source
console.log()
et en injectant dans plusieurs contrôleurs.Voici quelques exemples supplémentaires de services vs usines qui peuvent être utiles pour voir la différence entre eux. Fondamentalement, un service est appelé "nouveau ...", il est déjà instancié. Une fabrique n'est pas instanciée automatiquement.
Exemples de base
Renvoie un objet de classe qui a une seule méthode
Voici un service qui a une seule méthode:
Voici une fabrique qui renvoie un objet avec une méthode:
Renvoyer une valeur
Une usine qui renvoie une liste de nombres:
Un service qui renvoie une liste de numéros:
La sortie dans les deux cas est la même, la liste des nombres.
Exemples avancés
Variables de "classe" utilisant des usines
Dans cet exemple, nous définissons un CounterFactory, il incrémente ou décrémente un compteur et vous pouvez obtenir le nombre actuel ou obtenir combien d'objets CounterFactory ont été créés:
Nous utilisons le
CounterFactory
pour créer plusieurs compteurs. Nous pouvons accéder à la variable de classe pour voir combien de compteurs ont été créés:La sortie de ce code est:
la source
«Factory» et «Service» sont des façons différentes de faire DI (injection de dépendance) en angulaire.
Ainsi, lorsque nous définissons DI à l'aide de «service», comme indiqué dans le code ci-dessous. Cela crée une nouvelle instance GLOBALE de l'objet «Logger» et l'injecte dans la fonction.
Lorsque vous définissez DI à l'aide d'une «usine», il ne crée pas d'instance. Il passe simplement la méthode et plus tard, le consommateur doit en interne appeler la fabrique pour les instances d'objet.
Ci-dessous est une image simple qui montre visuellement comment le processus DI pour "Service" est différent de "Factory".
L'usine doit être utilisée lorsque nous voulons créer différents types d'objets en fonction des scénarios. Par exemple, selon le scénario, nous voulons créer un simple objet "Client", ou "Client" avec l'objet "Adresse" ou "Client" avec l'objet "Téléphone". Voici une explication détaillée de ce paragraphe
Le service doit être utilisé lorsque nous avons des fonctions utilitaires ou partagées à injecter comme l'utilitaire, l'enregistreur, le gestionnaire d'erreurs, etc.
la source
Style de service : ( probablement le plus simple ) renvoie la fonction réelle: Utile pour partager des fonctions utilitaires qu'il est utile d'invoquer en ajoutant simplement () à la référence de fonction injectée.
Un service dans AngularJS est un objet JavaScript singleton qui contient un ensemble de fonctions
Style d' usine : ( plus impliqué mais plus sophistiqué ) renvoie la valeur de retour de la fonction: instancier un objet comme new Object () en java.
Factory est une fonction qui crée des valeurs. Lorsqu'un service, un contrôleur, etc. a besoin d'une valeur injectée à partir d'une usine, l'usine crée la valeur à la demande. Une fois créée, la valeur est réutilisée pour tous les services, contrôleurs, etc. qui en ont besoin.
Style du fournisseur : (version complète configurable ) renvoie la sortie de la fonction $ get de la fonction: Configurable.
Les fournisseurs dans AngularJS est la forme d'usine la plus flexible que vous puissiez créer. Vous enregistrez un fournisseur avec un module comme vous le faites avec un service ou une usine, sauf que vous utilisez la fonction provider () à la place.
src jenkov
jsbin
jsfiddle
la source
La différence de base est que le fournisseur permet de définir des valeurs de fonction primitives (non-objets), de tableau ou de rappel dans la variable déclarée en usine, et donc si vous retournez un objet, il doit être explicitement déclaré et renvoyé.
D'un autre côté, un service ne peut être utilisé que pour définir la variable déclarée de service sur un objet, ainsi nous pouvons éviter la création explicite et le retour des objets, tandis que d'un autre côté il permet l'utilisation du mot - clé this .
Ou en bref, "le fournisseur est une forme plus générique alors que le service est limité aux objets uniquement".
la source
C'est ainsi que j'ai compris la différence entre eux en termes de modèles de conception:
Service : retourne un type, qui sera nouveau pour créer un objet de ce type. Si l'analogie Java est utilisée, Service renvoie une définition de classe Java .
Factory : renvoie un objet concret qui peut être immédiatement utilisé. Dans Java Analogy, une usine renvoie un objet Java .
La partie qui déroute souvent les gens (y compris moi-même) est que lorsque vous injectez un service ou une usine dans votre code, ils peuvent être utilisés de la même manière, ce que vous obtenez dans votre code dans les deux cas est un objet concret que vous pouvez immédiatement invoquer. Ce qui signifie en cas de Service, angulaire appelle "nouveau" sur la déclaration de service en votre nom. Je pense que c'est un concept compliqué.
la source
Ce serait la meilleure et courte réponse pour comprendre Service Vs Factory Vs Provider
Source : https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/HuZsOsMvKv4J
Voici ce que ben dit avec une démo http://jsbin.com/ohamub/1/edit?html,output
"Il y a des commentaires dans le code illustrant les principales différences, mais je vais les développer un peu ici. En guise de remarque, je me renseigne, donc si je dis quelque chose qui ne va pas, faites-le moi savoir.
Prestations de service
Syntaxe : module.service ('serviceName', fonction);
Résultat : lorsque vous déclarez serviceName comme argument injectable, la référence de fonction réelle transmise à module.service vous sera fournie.
Utilisation : pourrait être utile pour partager des fonctions utilitaires qu'il est utile d'invoquer en ajoutant simplement () à la référence de fonction injectée. Peut également être exécuté avec injectedArg.call (this) ou similaire.
Des usines
Syntaxe : module.factory ('factoryName', fonction);
Résultat : lorsque vous déclarez factoryName en tant qu'argument injectable, vous recevrez la valeur renvoyée en appelant la référence de fonction transmise à module.factory.
Utilisation : pourrait être utile pour renvoyer une fonction «classe» qui peut ensuite être renouvelée pour créer des instances.
Fournisseurs
Syntaxe : module.provider ('providerName', fonction);
Résultat : lors de la déclaration de providerName comme argument injectable, la valeur renvoyée vous sera fournie en appelant la méthode $ get de la référence de fonction transmise à module.provider.
Utilisation : pourrait être utile pour renvoyer une fonction «classe» qui peut ensuite être renouvelée pour créer des instances mais qui nécessite une sorte de configuration avant d'être injectée. Peut-être utile pour les classes réutilisables sur plusieurs projets? Toujours un peu flou sur celui-ci. "Ben
la source
J'ai eu cette confusion pendant un certain temps et je fais de mon mieux pour fournir une explication simple ici. J'espère que cela vous aidera!
angular .factory
et lesangular .service
deux sont utilisés pour initialiser un service et fonctionner de la même manière.La seule différence est la façon dont vous souhaitez initialiser votre service.
Les deux sont Singletons
Usine
app.factory (
<service name>
,<function with a return value>
)Si vous souhaitez initialiser votre service à partir d' une fonction que vous avez avec une valeur de retour , vous devez utiliser cette
factory
méthode.par exemple
Lors de l'injection de ce service (par exemple à votre contrôleur):
myService()
) pour retourner l'objetUn service
app.service (
<service name>
,<constructor function>
)Si vous souhaitez initialiser votre service à partir d' une fonction constructeur (à l'aide d'un
this
mot-clé), vous devez utiliser cetteservice
méthode.par exemple
Lors de l'injection de ce service (par exemple à votre contrôleur):
new
votre fonction donnée (asnew myService()
) pour retourner l'objetREMARQUE: Si vous utilisez
factory
avec<constructor function>
ouservice
avec<function with a return value>
, cela ne fonctionnera pas.Exemples - DEMO
la source
C'est ce qui m'a aidé à comprendre la différence, grâce à un article de blog de Pascal Precht.
Un service est une méthode sur un module qui prend un nom et une fonction qui définit le service. Vous pouvez injecter et utiliser ce service particulier dans d'autres composants, comme les contrôleurs, les directives et les filtres. Une usine est une méthode sur un module et elle prend également un nom et une fonction, qui définit l'usine. Nous pouvons également injecter et utiliser de la même manière que nous l'avons fait avec le service.
Les objets créés avec new utilisent la valeur de la propriété prototype de leur fonction constructeur comme prototype, j'ai donc trouvé le code angulaire qui appelle Object.create (), qui, selon moi, est la fonction constructeur de service lorsqu'elle est instanciée. Cependant, une fonction d'usine n'est en réalité qu'une fonction qui est appelée, c'est pourquoi nous devons renvoyer un objet littéral pour l'usine.
Voici le code angulaire 1.5 que j'ai trouvé en usine:
Extrait de code source angulaire pour la fonction factory ():
Il prend le nom et la fonction d'usine qui sont passés et retourne un fournisseur avec le même nom, qui a une méthode $ get qui est notre fonction d'usine. Chaque fois que vous demandez à l'injecteur une dépendance spécifique, il demande essentiellement au fournisseur correspondant une instance de ce service, en appelant la méthode $ get (). C'est pourquoi $ get () est requis lors de la création de fournisseurs.
Voici le code angulaire 1.5 pour le service.
Il s'avère que lorsque nous appelons service (), il appelle en fait factory ()! Cependant, il ne transmet pas simplement notre fonction de constructeur de services à l'usine telle quelle. Il transmet également une fonction qui demande à l'injecteur d'instancier un objet par le constructeur donné.
En d'autres termes, si nous injectons MyService quelque part, ce qui se passe dans le code est:
Pour le reformuler, un service appelle une fabrique, qui est une méthode $ get () sur le fournisseur correspondant. De plus, $ injector.instantiate () est la méthode qui appelle finalement Object.create () avec la fonction constructeur. C'est pourquoi nous utilisons "ceci" dans les services.
Pour ES5, peu importe ce que nous utilisons: service () ou usine (), c'est toujours une usine appelée qui crée un fournisseur pour notre service.
Vous pouvez également faire exactement la même chose avec les services. Un service est une fonction constructeur, cependant, qui ne nous empêche pas de renvoyer des littéraux d'objet. Nous pouvons donc prendre notre code de service et l'écrire de manière à ce qu'il fasse exactement la même chose que notre usine ou en d'autres termes, vous pouvez écrire un service en tant qu'usine pour retourner un objet.
Pourquoi la plupart des gens recommandent-ils d'utiliser les usines plutôt que les services? C'est la meilleure réponse que j'ai vue qui vient du livre de Pawel Kozlowski: Mastering Web Application Development with AngularJS.
la source
this
mot - clé pour définir la fonction.$get
vous définissez et il peut être utilisé pour obtenir l'objet qui renvoie les données.la source
Il existe trois façons de gérer la logique métier dans AngularJS: ( Inspiré du cours Coursera AngularJS de Yaakov ) qui sont:
Ici, nous allons seulement parler de Service vs Factory
SERVICE :
Syntaxe:
app.js
index.html
Les principales caractéristiques du service:
Paresseusement instancié : Si le service n'est pas injecté, il ne sera jamais instancié. Donc, pour l'utiliser, vous devrez l'injecter dans un module.
Singleton : s'il est injecté dans plusieurs modules, tous n'auront accès qu'à une seule instance particulière. C'est pourquoi, il est très pratique de partager des données entre différents contrôleurs.
USINE
Parlons maintenant de l'usine dans AngularJS
Voyons d'abord la syntaxe :
app.js :
Maintenant, en utilisant les deux ci-dessus dans le contrôleur:
Caractéristiques de l'usine:
Ces types de services suivent le modèle de conception d'usine . L'usine peut être considérée comme un lieu central qui crée de nouveaux objets ou méthodes.
Cela ne produit pas seulement des singleton, mais aussi des services personnalisables.
La
.service()
méthode est une usine qui produit toujours le même type de service, qui est un singleton. Il n'y a 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.la source
Pour une explication courte et simple, consultez https://stackoverflow.com/a/26924234/5811973 .
Pour une explication détaillée, consultez https://stackoverflow.com/a/15666049/5811973 .
Également à partir de la documentation angularJs:
la source
Vous pouvez comprendre la différence avec cette analogie - Considérez la différence entre une fonction normale qui renverra une valeur et une fonction constructeur qui sera instanciée à l'aide d'un nouveau mot-clé. un objet) alors que créer un service est comme créer une fonction constructeur (classe OO) dont nous pouvons créer une instance en utilisant un nouveau mot clé. La seule chose à noter est que lorsque nous utilisons la méthode Service pour créer des services, elle en créera automatiquement une instance à l'aide du mécanisme d'injection de dépendances pris en charge par AngularJS.
la source