2012-07-04 6 views
37

¿Cómo creo algún tipo de paquete de utilidades al que puedan acceder todos mis controladores?Creación de funciones de controlador comunes

que tienen 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 puede ser común a HomeCtrl, AdminCtrl y MainAppCtrl.

¿Cómo debo hacerlo en AngularJS?

Respuesta

61

La manera de definir el código común en angular es a través de Servicios.

, debe definir un nuevo servicio, así:

.factory('CommonCode', function ($window) { 
     var root = {}; 
     root.show = function(msg){ 
      $window.alert(msg); 
     }; 
     return root; 
    }); 

En su controlador que inyectaría este modo service..like

function MainAppCtrl($scope,CommonCode) 
{ 
    $scope.alerter = CommonCode; 
    $scope.alerter.show("Hello World"); 
} 

basta con incluir CommonCode como un argumento a la función de su controlador. . Angular se encargará de inyectarlo por ti (Leer en Inyección de Dependencia ... para entender lo que está sucediendo aquí.)

+6

Cualquier otra persona Encuéntralo ... ¿Es extraño que defina un servicio llamando al método de fábrica? Parece que algunas mejoras en los nombres contribuirían en gran medida a aumentar la accesibilidad del marco. – bclinkinbeard

+0

@bclinkinbeard exactamente mis pensamientos mientras estoy envolviendo mi cabeza alrededor de AngularJS. 'factory()', 'value()', 'constant()' y 'service()' parecen no ser más que accesos directos para casos específicos de 'provide()', que está destinado a ser utilizado para definir (prestación de servicios. Supongo que los documentos se beneficiarían de una solicitud de extracción que pone la frase anterior en letras grandes en alguna parte. – Tony

+0

Para ser sincero, cuando comencé esto es lo que me confundió. Factory() generalmente devuelve un singleton, como puede ver, del ejemplo anterior. Un servicio() - devuelve un constructor. Un valor() y constante() en lo que puedo decir generalmente hacen lo mismo. Y todos estos son wrapper (convenience) over provide() ... – ganaraj

7

Solo para actualizar la respuesta anterior (que Sólo a definir lo que factory es), hay 3 formas de inject dependencies (definir código común) en AngularJS:

  • Proveedores
  • fábricas
  • Servicios

no voy a hablar mucho de proveedor porque es un método más laborioso para la inyección de dependencia. Sin embargo, this page explica muy bien cómo funcionan.


Técnicamente, servicio y fábrica se utilizan para la misma cosa. Resulta que un servicio es una función constructora mientras que una fábrica no lo es.

De this post:

module.service('serviceName', function); 

Al declarar serviceName como argumento inyectable que será provisto con una instancia de la función.

module.factory('factoryName', function); 

Al declarar factoryName como argumento inyectable que será provisto con el valor que se devuelve mediante la invocación de la función referencia pasó a module.factory.


Puede utilizar la que prefiera y obtener el mismo resultado .

Aquí es dos códigos que hacen exactamente lo mismo a través de service primero, y luego factory:

sintaxis Servicio

app.service('MyService', function() { 
    this.sayHello = function() { 
    console.log('hello'); 
    }; 
}); 
sintaxis

fábrica

app.factory('MyService', function() { 
    return { 
    sayHello: function() { 
     console.log('hello'); 
    } 
    } 
}); 
Cuestiones relacionadas