Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When creating service method what's the difference between module.service and module.factory

Tags:

I don't know what is the best practice and what I should use.

What is the difference between below two methods?

module.service(..); 

and

module.factory(..); 
like image 411
yountae.kang Avatar asked May 15 '13 12:05

yountae.kang


People also ask

What is the difference between service and factory?

Essentially, factories are functions that return the object, while services are constructor functions of the object which are instantiated with the new keyword.

What is a factory service in AngularJS?

What is Factory in AngularJS? Factory is an angular function which is used to return the values. A value on demand is created by the factory, whenever a service or controller needs it. Once the value is created, it is reused for all services and controllers. We can use the factory to create a service.

What is the role of services in AngularJS and name any services made available by default?

AngularJS provides many inbuilt services. For example, $http, $route, $window, $location, etc. Each service is responsible for a specific task such as the $http is used to make ajax call to get the server data, the $route is used to define the routing information, and so on.

Which components can be injected as a dependency in AngularJS?

The "Application Module" can be injected as a dependency in AngularJS.


2 Answers

There is a great google group post about this from Pawel Kozlowski:

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

Quoted from Powel:

in fact $provide.provider, $provide.factory and $provide.service are more or less the same thing in the sense that all of them are blueprints / instructions for creating object instances (those instances are then ready to be injected into collaborators).

$provide.provider is the most spohisticated method of registering blueprints, it allows you to have a complex creation function and configuration options.

$provide.factory is a simplified version of $provide.provider when you don't need to support configuration options but still want to have a more sophisticated creation logic.

$provide.service is for cases where the whole creation logic boils down to invoking a constructor function.

So, depending on the complexity of your construction logic you would choose one of $provide.provider, $provide.factory and $provide.service but in the end what you are going to get is a new instance.

Here is the accompanying fiddle to demonstrate (from the thread): http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/

And the code:

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()]; } 
like image 125
lucuma Avatar answered Oct 24 '22 03:10

lucuma


Consider the following service.

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

If you had an app, in which a variety of controllers, views, etc, all want to contribute to one general count of things, the above service works.

But what if each app wants to keep its own tally of things?

In that case, a singleton service would not work since it can only keep track of all of them. However, a factory lets you create a new service every time you want to start a new counter.

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

With the above factory, you can call new thingCountingServiceFactory() at any time and get a new thingCountingService set to 0

like image 37
Code Whisperer Avatar answered Oct 24 '22 03:10

Code Whisperer