I am working with AngularJS 1.x and I can define the same service multiple times in the same module. In the following snippet of code, I am defining the service nameService
2 times in module myApp
:
(function() {
'use strict';
angular
.module('myApp', [])
.controller('MainController', MainController)
.factory('nameService', nameService1)
.factory('nameService', nameService2);
MainController.$inject = ['nameService'];
function MainController(nameService) {
var vm = this;
vm.message = nameService.getName();
}
function nameService1() {
return {
getName: getName
};
function getName() {
return 'First Definition';
}
}
function nameService2() {
return {
getName: getName
};
function getName() {
return 'Second Definition';
}
}
})();
At runtime, AngularJS will use the value returned by the second implementation of the service: "Second Definition". Please check the this Plunker example.
So, empirically, AngularJS seems to use always the latest definition of a service, ignoring the previous ones.
My question is: is there any official documentation describing this behavior?
Here, you are overwriting definition of factory/service. factory/service is singleton i.e. there will be only one instance of it.
factory('name', constructing_function)
Your case,
factory('nameService', nameService1)//Here object { getName: getName } will be assigned to nameService instance.
factory('nameService', nameService2)//Here object { getName: getName } (#2nd definition) will be assigned to nameService instance. i.e. nameservice instance referring to (#2nd definition).
That's the way how JavaScript works:
function Vinoth(){console.log("Printing first")}
function Something(){console.log("Printing Something")}
function Vinoth(){console.log("Printing Second")}
When you do a console.log(Vinoth());
, it would always print the Second
one. Over to your second part:
angular
.module('myApp', [])
.controller('MainController', MainController)
.factory('nameService', nameService1)
.factory('nameService', nameService2);
AngularJS services are singleton
by nature, so its going to be one instance across your application life cycle. Your nameService1 and nameService2
are pointing to same nameService
instance
. Technically it nameService
holds nameService2
as it precedes according to hoisting.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With