2013-05-15 11 views
25

Non so quale sia la procedura migliore e cosa dovrei usare.Quando si crea il metodo di servizio qual è la differenza tra module.service e module.factory

Qual è la differenza tra i due metodi seguenti?

module.service(..); 

e

module.factory(..); 
+4

possibile duplicato di [Angular.js: servizio vs fornire vs fabbrica?] (Http: // stackoverflow.com/questions/15666048/angular-js-service-vs-provide-vs-factory) –

+0

@MarkRajcok è ma la risposta qui ha esempi migliori –

risposta

47

V'è un grande post gruppo Google su questo da Pawel Kozlowski:

https://groups.google.com/forum/#!msg/angular/hVrkvaHGOfc/idEaEctreMYJ

Citato da Powel:

infatti $ provide.provider, $ provide.factory e $ provide.service sono più o meno la stessa cosa, nel senso che tutti sono blueprint/istruzioni per la creazione di istanze di oggetto (quelle istanze sono quindi pronte per essere inserite nei collaboratori).

$ provide.provider è il metodo più sofisticato di registrazione dei progetti , consente di disporre di una funzione di creazione complessa e delle opzioni di configurazione .

$ provide.factory è una versione semplificata di $ provide.provider quando non è necessario supportare le opzioni di configurazione con ma si desidera comunque avere una logica di creazione più sofisticata .

$ provide.service è per i casi in cui l'intera logica di creazione bolle in basso per richiamare una funzione di costruzione.

Quindi, a seconda della complessità della logica di costruzione si scegliere uno dei $ provide.provider, $ provide.factory e $ provide.service ma alla fine quello che si sta per ottenere è una nuova istanza.

Ecco il violino di accompagnamento per dimostrare (dal thread): http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/

E il codice:

var myApp = angular.module('myApp', []); 

//service style, probably the simplest one 
myApp.service('helloWorldFromService', function() { 
    this.sayHello = function() { 
     return "Hello, World!" 
    }; 
}); 

//factory style, more involved but more sophisticated 
myApp.factory('helloWorldFromFactory', function() { 
    return { 
     sayHello: function() { 
      return "Hello, World!" 
     } 
    }; 
}); 

//provider style, full blown, configurable version  
myApp.provider('helloWorld', function() { 

    this.name = 'Default'; 

    this.$get = function() { 
     var name = this.name; 
     return { 
      sayHello: function() { 
       return "Hello, " + name + "!" 
      } 
     } 
    }; 

    this.setName = function(name) { 
     this.name = name; 
    }; 
}); 

//hey, we can configure a provider!    
myApp.config(function(helloWorldProvider){ 
    helloWorldProvider.setName('World'); 
}); 


function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) { 

    $scope.hellos = [ 
     helloWorld.sayHello(), 
     helloWorldFromFactory.sayHello(), 
     helloWorldFromService.sayHello()]; 
} 
+2

+1 Ci sono parecchie domande/risposte più popolari sul servizio vs fabbrica (fornitore vs) concetto (e li ho esaminati un paio di volte), ma questa è di gran lunga la spiegazione più chiara. Mi avrebbe risparmiato un bel po 'di tempo, se l'avessi trovato prima :) – gkalpak

+0

e per le funzioni che hanno dipendenze? Puoi usare la notazione DI? 'myApp.service ('helloWorldFromService', ['$ risorsa', funzione ($ risorsa) {...}'? –

+0

Sicuro. http://plnkr.co/edit/bjWLgAVhdXHRk8K1Gzl5?p=preview – lucuma

1

Si consideri il seguente servizio.

angular.module("myModule", []) 
.service("thingCountingService", function() { 
    var thingCount = 0; 
    this.countThing = function() { thingCount++; } 
    this.getNumThings = function() { return thingCount; } 
}); 

Se tu avessi un app, in cui una serie di controllori, viste, ecc, tutti vogliono contribuire ad un conteggio generale delle cose, il servizio di cui sopra funziona.

Ma cosa succede se ogni app vuole mantenere il proprio conteggio delle cose?

In tal caso, un servizio di singleton non funzionerebbe poiché può solo tenere traccia di tutti loro. Tuttavia, una factory ti consente di creare un nuovo servizio ogni volta che vuoi iniziare un nuovo contatore.

angular.module("myModule", []) 
.factory("thingCountingServiceFactory", function() { 
    var thingCount = 0; 
    this.countThing = function() { thingCount++; } 
    this.getNumThings = function() { return thingCount; } 
}); 

Con quanto sopra fabbrica, è possibile chiamare new thingCountingServiceFactory() in qualsiasi momento e ottenere un nuovo set di thingCountingService0

+0

Cosa intendi? by - "Ma cosa succede se ogni app vuole mantenere il proprio conteggio delle cose?" Ho una sola app e anche tutti. –

Problemi correlati