Estoy usando la plantilla de semilla angular para estructurar mi aplicación. Inicialmente pongo toda mi código JavaScript en un solo archivo, main.js
. Este archivo contenía mi declaración de módulo, controladores, directivas, filtros y servicios. La aplicación funciona bien así, pero me preocupa la escalabilidad y la capacidad de mantenimiento a medida que mi aplicación se vuelve más compleja. Me di cuenta de que la plantilla de semilla angular tiene archivos separados para cada uno de estos, así que intenté distribuir mi código desde el main.js
archivo único en cada uno de los otros archivos mencionados en el título de esta pregunta y que se encuentran en el app/js
directorio de angular -plantilla de semillas .
Mi pregunta es: ¿cómo administro las dependencias para que la aplicación funcione? La documentación existente que se encuentra aquí no es muy clara a este respecto, ya que cada uno de los ejemplos dados muestra un solo archivo fuente de JavaScript.
Un ejemplo de lo que tengo es:
app.js
angular.module('myApp',
['myApp.filters',
'myApp.services',
'myApp.controllers']);
controllers.js
angular.module('myApp.controllers', []).
controller('AppCtrl', [function ($scope, $http, $filter, MyService) {
$scope.myService = MyService; // found in services.js
// other functions...
}
]);
filtros.js
angular.module('myApp.filters', []).
filter('myFilter', [function (MyService) {
return function(value) {
if (MyService.data) { // test to ensure service is loaded
for (var i = 0; i < MyService.data.length; i++) {
// code to return appropriate value from MyService
}
}
}
}]
);
services.js
angular.module('myApp.services', []).
factory('MyService', function($http) {
var MyService = {};
$http.get('resources/data.json').success(function(response) {
MyService.data = response;
});
return MyService;
}
);
main.js
/* This is the single file I want to separate into the others */
var myApp = angular.module('myApp'), []);
myApp.factory('MyService', function($http) {
// same code as in services.js
}
myApp.filter('myFilter', function(MyService) {
// same code as in filters.js
}
function AppCtrl ($scope, $http, $filter, MyService) {
// same code as in app.js
}
¿Cómo gestiono las dependencias?
Gracias por adelantado.
fuente
angular.module('myApp.services', ['myApp.services']);
en app.js sin suerte.angular.module('myApp.services', ['myApp.server', 'myApp.somethingElse'])
.angular.module('myApp.service1', ['myApp.service1', 'myApp.service2'])
originalmente. De lo contrario, no habría incluido myApp.services como su propia dependencia.Respuestas:
El problema se debe a que "redeclara" el módulo de la aplicación en todos los archivos separados.
Así es como se ve la declaración del módulo de la aplicación (no estoy seguro de que la declaración sea el término correcto):
Así es como se ve la asignación (tampoco estoy seguro si la asignación es el término correcto) a su módulo de aplicación:
Observe la falta de corchetes.
Entonces, la versión anterior, una con corchetes, solo debe usarse una vez, generalmente en su
app.js
omain.js
. Todos los demás archivos asociados - controladores, directivas, filtros … - deben usar la última versión, la que no tiene corchetes.Espero que tenga sentido. ¡Salud!
fuente
myApp
. En mi archivo app.js creé una var para él.Envar myApp = angular.module('myApp', []);
todos los demás archivos, simplemente me referí a esta var (por ejemplo,myApp.filter('myFilter', function(MyService) { /* filter code */ });
siempre que agregué los nombres de archivo en las etiquetas de script en mi html, no necesitaba declarar ninguna otra dependencias. La plantilla de proyecto de semilla angular es bastante confusa en este sentido.myApp
, por lo que ahora es un módulo anónimo enapp.js
:angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers']);
. En todos los demás archivos también declaré módulos anónimos como esteangular.module('myApp.filter', []).filter('myFilter', function(MyService) { /* filter code */ });
. Mi aplicación ahora también funciona así. Revisé mi historial de código y no puedo ver dónde es diferente a lo que yo cuando no funcionó.angular.module('myApp', []);
(observe los corchetes) en mi archivo js principal. Luego, todos los demás archivos se refieren al módulo mediante la sintaxisangular.module('myApp').controller
o.directive
.ngCookies
,ngResource
) cuando declare el módulo principal de su aplicación:angular.module('myApp', []);
ngResource
es definitivamente uno de los que coloca en los corchetes de declaración de su módulo. Si mi respuesta ayudó, se agradecería mucho votar y aprobarla.Si desea colocar las diferentes partes de su aplicación (
filters, services, controllers
) en diferentes archivos físicos, hay dos cosas que debe hacer:app.js
o en cada archivo;Entonces, tu
app.js
se vería así:Y en cada archivo individual:
services.js
controllers.js
Todo esto se puede combinar en una sola llamada:
controllers.jsLa parte importante es que no debes redefinir
angular.module('myApp')
; eso haría que se sobrescribiera al crear una instancia de sus controladores, probablemente no sea lo que desea.fuente
Obtiene el error porque aún no
myApp.services
ha definido . Lo que hice hasta ahora fue poner todas las definiciones iniciales en un archivo y luego usarlas en otro. Como para tu ejemplo, pondría:app.js
Eso debería eliminar el error, aunque creo que debería haber leído el artículo que Eduard Gamonal mencionó en uno de los comentarios.
fuente
angular.module('myApp.services', []);
a mi archivo app.js. Ninguno aborda realmente mi problema.