A Service in AngularJS is implemented as a singleton. As such it can be used in multiple controllers and can be the means to share objects and values across controllers given that each controller has an independent $scope.
A service is defined by calling the Module.service function and passing a service name and a function where we add variables and functions.
var myApp = angular.module('myApp', ['ngRoute']);
myApp.service('nameService', function() {
var self = this;
this.name = 'Some Name';
this.someFunction = function() {
... use self variable here
return someValue;
};
});
To make the service accessible to controllers, it needs to be injected like any other service. If the service contains a value that needs to be changeable from multiple controllers, there are two things that we need to do in each controller:
- We need to assign the service value to a scope variable to make it accessible in the view.
- We need to make the scope observe the scope variable by calling the $watch function, which takes the variable name and a function. Inside this function we will update the service variable.
If we perform those two tasks we will insure the controllers will be sharing a value using the service as the intermediary.
myApp.controller('mainController', ['$scope', '$log', 'nameService', function($scope, $log, nameService) {
$scope.name = nameService.name;
$scope.$watch('name', function() {
nameService.name = $scope.name;
});
$log.log(nameService.name);
}]);
