JvdBerg JvdBerg - 5 months ago 8
AngularJS Question

Confused about Service vs Factory

As I understand it, when inside a factory I return an object that gets injected into a controller. When inside a service I am dealing with the object using

this
and not returning anything.

I was under the assumption that a service was always a singleton, and that a new factory object gets injected in every controller. However, as it turns out, a factory object is a singleton too?

Example code to demonstrate:

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;
});


When changing
user.first
in
ACtrl
it turns out that
user.first
in
BCtrl
is also changed, e.g.
User
is a singleton?

My assumption was that a new instance was injected in a controller with a factory?

Answer

All angular services are singletons:

Docs (see Services as singletons): https://docs.angularjs.org/guide/services

Lastly, it is important to realize that all Angular services are application singletons. This means that there is only one instance of a given service per injector.

Basically the difference between the service and factory is as follows:

app.service('myService', function() {

  // service is just a constructor function
  // that will be called with 'new'

  this.sayHello = function(name) {
     return "Hi " + name + "!";
  };
});

app.factory('myFactory', function() {

  // factory returns an object
  // you can run some code before

  return {
    sayHello : function(name) {
      return "Hi " + name + "!";
    }
  }
});

Check out this presentation about $provide: http://slides.wesalvaro.com/20121113/#/

Those slides were used in one of the AngularJs meetups: http://blog.angularjs.org/2012/11/more-angularjs-meetup-videos.html

Comments