* Los controladores se pueden comunicar entre si con más técnicas, como scopes heredados y $rootScope.$broadcast
angular.module('angularJsmadridServiciosApp')
.controller('MainCtrl', function ($scope, Calculadora) {
$scope.total1 = Calculadora.suma(1,2);
$scope.total2 = Calculadora.suma(1,2,3);
$scope.total3 = Calculadora.suma(1,2,3,4);
});
<p>Total: {{total1}}</p> <p>Total: {{total2}}</p> <p>Total: {{total3}}</p>
'use strict';
angular.module('angularJsmadridServiciosApp')
.service('Calculadora', function Calculadora() {
this.suma = function () {
//...
};
});
'use strict';
angular.module('angularJsmadridServiciosApp')
.service('Calculadora', function Calculadora() {
this.suma = function () {
return [].reduce.call(arguments,
function(acc, val){return acc + val;},
0);
};
});
fun.apply(thisArg[, argsArray])
fun.call(thisArg[, arg1[, arg2[, ...]]])
angular.module('angularJsmadridServiciosApp')
.constant('E', 2.718281828459045);
angular.module('angularJsmadridServiciosApp')
.value('c', 300000000);
MiServicio -> MiControlador
MiDecorador(MiServicio) -> MiControlador
function Contador() {
this._cuenta = 0;
}
Contador.prototype.total = function (){
return this._cuenta;
};
Contador.prototype.click = function (){
this._cuenta++;
};
angular.module('angularJsmadridServiciosApp')
.service('Contador', Contador);
'use strict';
angular.module('angularJsmadridServiciosApp')
.controller('Ej4Ctrl', function ($scope, Contador) {
$scope.total = function () {
return Contador.total();
};
$scope.click = function () {
Contador.click();
};
});
'use strict';
angular.module('angularJsmadridServiciosApp')
.controller('Ej5Ctrl', function ($scope, Contador) {
$scope.total = Contador.total;
$scope.click = Contador.click;
});
$scope.click = function (){
Servicio1.metodoX()
.then(Servicio2.metodoY)
.then(Servicio3.metodoX)
.then(function (datos){
$scope.resultado = datos;
})
}
'use strict';
angular.module('angularJsmadridServiciosApp')
.factory('Contador2', function () {
var cuenta = 0;
function total(){
return cuenta;
}
function click(){
cuenta++;
}
return {
total: total,
click: click
};
});
(function (){ var cuenta = 0; function total(){ return cuenta; } function click(){ cuenta++; }
angular.module('angularJsmadridServiciosApp') .factory('Contador3', function () { return { total: total, click: click }; }); }());
angular.module('angularJsmadridServiciosApp') .provider('Unavocal', function () { function traduce(s) { //función del servicio return s && s.replace(/[aeiou]/ig, 'a'); }
this.$get = function () { //factoría return { traduce: traduce }; }; });
function factory(name, factoryFn) {
return provider(name, { $get: factoryFn });
}
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
"instantiate" hace el new inyectando dependencias.
Identifica si constructor es un array de la forma
["dep1", "dep2", function (dep1, dep2){...}]
o directamente
function (dep1, dep2){...}
angular.module('angularJsmadridServiciosApp')
.provider('Unavocal', function () {
var dialecto = 'a';
this.setDialecto = function (s){ //método para configurar provider
dialecto = s;
};
function traduce(s) {
return s && s.replace(/[aeiou]/ig, dialecto);
}
this.$get = function () {
return {
traduce: traduce
};
};
});
module.config(function(miServicioProvider) { });
module.provider('miServicio', function() { });
module.provider('miServicio', function() { });
module.config(function(miServicioProvider) { });
Algunas cosas no son tan "lazy" como esperaríamos
'use strict';
angular.module('angularJsmadridServiciosApp')
.config(function($provide) {
//def de dialecto, setDialecto y traduce...
$provide.provider('Unavocal3', {
setDialecto: setDialecto,
$get: function () {
return {
traduce: traduce
};
}
});
});
Aparatoso pero ayuda a introducir los decorators
MiServicio -> MiControlador
MiDecorador(MiServicio) -> MiControlador
angular.module('angularJsmadridServiciosApp')
.config(function ($provide) {
$provide.decorator('c2', function ($delegate) {
var furlongsPorMetro = 201.168;
return $delegate / furlongsPorMetro;
});
});
MiDecorador(MiDecorador(MiServicio) )-> MiControlador
angular.module('angularJsmadridServiciosApp')
.config(function ($provide) {
$provide.decorator('c3', function ($delegate) {
var furlongsPorMetro = 201.168;
return $delegate / furlongsPorMetro;
});
})
.config(function ($provide) {
$provide.decorator('c3', function ($delegate) {
var rodsPorFurlong = 40;
return $delegate * rodsPorFurlong;
});
});
angular.module('angularJsmadridServiciosApp')
.config(function ($provide) {
$provide.decorator('$log', function ($delegate) {
var debugFn = $delegate.debug;
$delegate.debug = function() {
var now = (new Date()).toLocaleTimeString();
arguments[0] = now + ' - ' + arguments[0];
debugFn.apply(null, arguments);
};
return $delegate;
});
});