EDIT Jan 2016: Depuis cela attire encore l'attention. Depuis que j'ai demandé cela, j'ai terminé quelques projets AngularJS, et pour ceux que j'ai principalement utilisés factory
, j'ai construit un objet et renvoyé l'objet à la fin. Mes déclarations ci-dessous sont toujours vraies.
EDIT: Je pense enfin comprendre la différence principale entre les deux et j'ai un exemple de code à illustrer. Je pense aussi que cette question est différente du duplicata proposé. Le duplicata indique que le service n’est pas instable, mais si vous le configurez comme je l’ai montré ci-dessous, c’est le cas. Un service peut être configuré pour être identique à une usine. Je fournirai également un code indiquant les cas de défaillance du service par l’usine, ce qu’aucune autre réponse ne semble faire.
Si je configure VaderService comme suit (c.-à-d. En tant que service):
var module = angular.module('MyApp.services', []);
module.service('VaderService', function() {
this.speak = function (name) {
return 'Join the dark side ' + name;
}
});
Ensuite, dans mon contrôleur, je peux faire ceci:
module.controller('StarWarsController', function($scope, VaderService) {
$scope.luke = VaderService.speak('luke');
});
Avec le service, le VaderService injecté dans le contrôleur est instancié. Je ne peux donc appeler que VaderService.speak. Toutefois, si je change le VaderService en module.factory, , le code du contrôleur ne fonctionnera plus. , et c'est la différence principale. Avec factory, le VaderService injecté dans le contrôleur est pas instancié, raison pour laquelle vous devez renvoyer un objet lors de la configuration d'une factory (voir mon exemple dans la question).
Cependant, vous pouvez configurer un service exactement de la même manière que vous pouvez configurer une usine (par exemple, le faire retourner à un objet) et le service se comporte exactement comme une usine
Compte tenu de cette information, je ne vois aucune raison d'utiliser le service après-vente en usine, le service peut tout faire en usine et plus encore.
Question originale ci-dessous.
Je sais que cela a souvent été demandé, mais je ne vois vraiment aucune différence fonctionnelle entre les usines et les services. J'avais lu ce tutoriel: http://blogs.clevertech.biz/startupblog/angularjs-factory-service-provider
Et cela semble donner une bonne explication, cependant, j’ai configuré mon application comme suit:
index.html
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
<script src="lib/angular/angular.js"></script>
<script type="text/javascript" src="js/controllers.js"></script>
<script type="text/javascript" src="js/VaderService.js"></script>
<script type="text/javascript" src="js/app.js"></script>
</head>
<body ng-app="MyApp">
<table ng-controller="StarWarsController">
<tbody>
<tr><td>{{luke}}</td></tr>
</tbody>
</table>
</body>
</html>
app.js:
angular.module('MyApp', [
'MyApp.services',
'MyApp.controllers'
]);
controllers.js:
var module = angular.module('MyApp.controllers', []);
module.controller('StarWarsController', function($scope, VaderService) {
var luke = new VaderService('luke');
$scope.luke = luke.speak();
});
VaderService.js
var module = angular.module('MyApp.services', []);
module.factory('VaderService', function() {
var VaderClass = function(padawan) {
this.name = padawan;
this.speak = function () {
return 'Join the dark side ' + this.name;
}
}
return VaderClass;
});
Puis, quand je charge index.html, je vois "Rejoindre le côté sombre luke", c'est bien. Exactement comme prévu. Cependant, si je modifie VaderService.js en ceci (notez module.service au lieu de module.factory):
var module = angular.module('MyApp.services', []);
module.service('VaderService', function() {
var VaderClass = function(padawan) {
this.name = padawan;
this.speak = function () {
return 'Join the dark side ' + this.name;
}
}
return VaderClass;
});
Puis reload index.html (je me suis assuré de vider le cache et de recharger le disque). Cela fonctionne exactement comme avec module.factory. Alors, quelle est la vraie différence fonctionnelle entre les deux ??
La différence entre usine et service ressemble à la différence entre une fonction et un objet
Fournisseur d'usine
Donne-nous la valeur de retour de la fonction c'est-à-dire. Vous venez de créer un objet, d'y ajouter des propriétés, puis de renvoyer le même objet. Lorsque vous transmettez ce service à votre contrôleur, ces propriétés de l'objet sont désormais disponibles dans ce contrôleur via votre fabrique. (Scénario hypothétique)
Singleton et ne sera créé qu'une fois
Composants réutilisables
Factory sont un excellent moyen de communication entre contrôleurs, comme le partage de données.
Peut utiliser d'autres dépendances
Habituellement utilisé lorsque l'instance de service nécessite une logique de création complexe
Ne peut pas être injecté dans la fonction .config()
.
Utilisé pour des services non configurables
Si vous utilisez un objet, vous pouvez utiliser le fournisseur d'usine.
Syntaxe: module.factory('factoryName', function);
Fournisseur de service
Nous donne l'instance d'une fonction (objet) - Vous venez d'instancier avec le mot-clé 'new' et vous ajouterez des propriétés à 'this' et le service retournera 'this'. Lorsque vous transmettez le service à votre contrôleur, ces propriétés sur 'this' sera désormais disponible sur ce contrôleur via votre service. (Scénario hypothétique)
Singleton et ne sera créé qu'une fois
Composants réutilisables
Les services sont utilisés pour la communication entre les contrôleurs afin de partager des données
Vous pouvez ajouter des propriétés et des fonctions à un objet de service à l’aide du mot clé this
.
Les dépendances sont injectées comme arguments de constructeur
Utilisé pour une logique de création simple
Ne peut pas être injecté dans la fonction .config()
.
Si vous utilisez une classe, vous pouvez utiliser le fournisseur de services
Syntaxe: module.service(‘serviceName’, function);
Dans l'exemple ci-dessous, j'ai défini MyService
et MyFactory
. Notez comment dans .service
j'ai créé les méthodes de service à l'aide de this.methodname.
Dans .factory
j'ai créé un objet fabrique et lui ai affecté les méthodes.
AngularJS .service
module.service('MyService', function() {
this.method1 = function() {
//..method1 logic
}
this.method2 = function() {
//..method2 logic
}
});
AngularJS .factory
module.factory('MyFactory', function() {
var factory = {};
factory.method1 = function() {
//..method1 logic
}
factory.method2 = function() {
//..method2 logic
}
return factory;
});
Regardez aussi ces belles choses
Confus au sujet du service par rapport à l'usine
Factory
et Service
est juste un wrapper d'un provider
.
Usine
Factory
peut renvoyer tout ce qui peut être class(constructor function)
, instance of class
, string
, number
ou boolean
. Si vous retournez une fonction constructor
, vous pouvez l'instancier dans votre contrôleur.
myApp.factory('myFactory', function () {
// any logic here..
// Return any thing. Here it is object
return {
name: 'Joe'
}
}
Service
Le service n'a pas besoin de retourner quoi que ce soit. Mais vous devez tout affecter dans la variable this
. Parce que service créera une instance par défaut et l'utilisera comme objet de base.
myApp.service('myService', function () {
// any logic here..
this.name = 'Joe';
}
Code angularjs réel derrière le service
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
C'est juste une enveloppe autour de la factory
. Si vous retournez quelque chose de service
, alors il se comportera comme Factory
.
IMPORTANT
: Le résultat renvoyé par Factory et Service sera cache et identique pour tous les contrôleurs.
Quand devrais-je les utiliser?
Factory
est généralement préférable dans tous les cas. Il peut être utilisé lorsque vous avez la fonction constructor
qui doit être instanciée dans différents contrôleurs.
Service
est une sorte d'objet Singleton
. Le retour d'objet du service sera le même pour tous les contrôleurs. Il peut être utilisé lorsque vous souhaitez avoir un seul objet pour toute l'application. Par exemple: détails de l'utilisateur authentifié.
Pour plus de compréhension, lisez
http://iffycan.blogspot.in/2013/05/angular-service-or-factory.html
http://viralpatel.net/blogs/angularjs-service-factory-tutorial/
Factory et Service sont les recettes les plus couramment utilisées. La seule différence entre eux est que la recette de service fonctionne mieux pour les objets de type personnalisé, tandis que Factory peut produire des primitives et des fonctions JavaScript.
Il s’agit techniquement de la même chose, c’est en fait une notation différente qui consiste à utiliser la fonction provider
du service $provide
.
La différence niquement entre la service
et la factory
notation est que le service est new-ed et l'usine n'est pas. Mais pour tout le reste, ils ont tous les deux look, odeur et se comportent identiques. Encore une fois, il s’agit d’un raccourci pour la fonction $ remove.provider.
_// Factory
angular.module('myApp').factory('myFactory', function() {
var _myPrivateValue = 123;
return {
privateValue: function() { return _myPrivateValue; }
};
});
// Service
function MyService() {
this._myPrivateValue = 123;
}
MyService.prototype.privateValue = function() {
return this._myPrivateValue;
};
angular.module('myApp').service('MyService', MyService);
_