tipos - prompt javascript ejemplo
Creando funciones de controlador comunes (2)
¿Cómo creo algún tipo de paquete de utilidades que sea accesible desde todos mis controladores?
Tengo este código de ruta en mi módulo principal:
''use strict'';
angular.module(''lpConnect'', []).
config([''$routeProvider'', function($routeProvider) {
$routeProvider.
when(''/home'', {template: ''views/home.html'', controller: HomeCtrl}).
when(''/admin'', {template: ''views/admin.html'', controller: AdminCtrl}).
when(''/connect'', {template: ''views/fb_connect.html'', controller: MainAppCtrl}).
otherwise({redirectTo: ''/connect''});
}]);
Quiero una función que pueda ser común para HomeCtrl
, AdminCtrl
y MainAppCtrl
.
¿Cómo debería hacerlo en AngularJS?
La forma de definir un código común en angular es a través de Servicios.
Definirías un nuevo servicio así:
.factory(''CommonCode'', function ($window) {
var root = {};
root.show = function(msg){
$window.alert(msg);
};
return root;
});
En tu controlador deberías inyectar este servicio ... como
function MainAppCtrl($scope,CommonCode)
{
$scope.alerter = CommonCode;
$scope.alerter.show("Hello World");
}
Simplemente incluya CommonCode como argumento para su función de controlador. Angular se encargará de inyectarlo por usted (Leer en Inyección de Dependencia ... para comprender lo que está sucediendo aquí).
Solo para actualizar la respuesta anterior (que solo define qué factory
es), hay 3 formas de inyectar dependencias (definir código común) en AngularJS:
- Proveedores
- Suerte
- Servicios
No hablaré mucho sobre el proveedor porque es un método más laborioso para la inyección de dependencia. Sin embargo, esta página explica muy bien cómo funcionan.
Técnicamente, el servicio y la fábrica se utilizan para lo mismo. Resulta que un servicio es una función constructora mientras que una fábrica no lo es.
De esta publicación :
module.service( ''serviceName'', function );
Al declarar
serviceName
como un argumento inyectable, se le proporcionará una instancia de la función .
module.factory( ''factoryName'', function );
Al declarar
factoryName
como un argumento inyectable, se le proporcionará el valor que se devuelve invocando la referencia de función pasada a module.factory.
Puede usar el que prefiera y obtener el mismo resultado .
Aquí hay dos códigos que hacen exactamente lo mismo a través del service
primero y luego de factory
:
Sintaxis del servicio
app.service(''MyService'', function () {
this.sayHello = function () {
console.log(''hello'');
};
});
Sintaxis de fábrica
app.factory(''MyService'', function () {
return {
sayHello: function () {
console.log(''hello'');
}
}
});