Je vous prie d'être indulgent avec moi. Je sais qu'il y a d'autres réponses telles que : AngularJS : service, fournisseur et usine
Cependant, je n'arrive toujours pas à comprendre quand on utilise le service plutôt que l'usine.
D'après ce que j'ai pu constater, la notion de "factory" est généralement utilisée pour créer des fonctions "communes" qui peuvent être appelées par plusieurs contrôleurs : Création de fonctions de contrôleur communes
La documentation d'Angular semble préférer l'usine au service. Ils font même référence à "service" lorsqu'ils utilisent factory, ce qui est encore plus déroutant ! http://docs.angularjs.org/guide/dev_guide.services.creating_services
Alors, quand utiliser le service ?
Y a-t-il quelque chose qui n'est possible ou qui est beaucoup plus facile à faire qu'avec le service ?
Y a-t-il quelque chose de différent qui se passe en coulisses ? Des différences de performance/mémoire ?
Voici un exemple. À part la méthode de déclaration, ils semblent identiques et je n'arrive pas à comprendre pourquoi je ferais l'un plutôt que l'autre. http://jsfiddle.net/uEpkE/
Mise à jour : D'après la réponse de Thomas, il semble que service soit destiné à une logique plus simple et factory à une logique plus complexe avec des méthodes privées. J'ai donc mis à jour le code ci-dessous et il semble que les deux soient capables de prendre en charge les fonctions privées ?
myApp.factory('fooFactory', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo; }
return {
setFoobar: function(foo){
addHi(foo);
},
getFoobar:function(){
return fooVar;
}
};
});
myApp.service('fooService', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo;}
this.setFoobar = function(foo){
addHi(foo);
}
this.getFoobar = function(){
return fooVar;
}
});
function MyCtrl($scope, fooService, fooFactory) {
fooFactory.setFoobar("fooFactory");
fooService.setFoobar("fooService");
//foobars = "Hi fooFactory, Hi fooService"
$scope.foobars = [
fooFactory.getFoobar(),
fooService.getFoobar()
];
}
0 votes
Bien sûr, le service supporte le private mais si vous lisez correctement mon post, c'est purement du style de code : nous pouvons aussi profiter d'une nouvelle portée lexicale pour simuler des variables "privées". C'est "SIMULATE".
0 votes
Je trouve cette discussion très utile stackoverflow.com/questions/15666048/
2 votes
Il y a Quelques bonnes réponses ici aussi.