'Mejor' forma de declarar un módulo
Como angular está en el alcance global y los módulos se guardan en su variable, puede acceder a los módulos a través de angular.module('mymod'):
// one file
// NOTE: the immediately invoked function expression
// is used to exemplify different files and is not required
(function(){
// declaring the module in one file / anonymous function
// (only pass a second parameter THIS ONE TIME as a redecleration creates bugs
// which are very hard to dedect)
angular.module('mymod', []);
})();
// another file and/or another anonymous function
(function(){
// using the function form of use-strict...
"use strict";
// accessing the module in another.
// this can be done by calling angular.module without the []-brackets
angular.module('mymod')
.controller('myctrl', ['dep1', function(dep1){
//..
}])
// appending another service/controller/filter etc to the same module-call inside the same file
.service('myservice', ['dep2', function(dep2){
//...
}]);
// you can of course use angular.module('mymod') here as well
angular.module('mymod').controller('anothermyctrl', ['dep1', function(dep1){
//..
}])
})();
No se requieren otras variables globales.
Por supuesto, todo depende de las preferencias, pero creo que esta es la mejor práctica, ya que
- no tienes que contaminar el alcance global
- puede acceder a sus módulos en todas partes y ordenarlos y sus funciones en diferentes archivos a voluntad
- puede usar la forma de función de "use estricto";
- el orden de carga de los archivos no importa tanto
Opciones para ordenar sus módulos y archivos
Esta forma de declarar y acceder a los módulos te hace muy flexible. Puede ordenar los módulos por tipo de función (como se describe en otra respuesta) o por ruta, por ejemplo:
/******** sorting by route **********/
angular.module('home')...
angular.module('another-route')...
angular.module('shared')...
La forma en que lo clasifique al final es una cuestión de gusto personal y la escala y el tipo de proyecto. Personalmente, me gusta agrupar todos los archivos de un módulo dentro de la misma carpeta (ordenados en subcarpetas de directivas, controladores, servicios y filtros), incluidos todos los archivos de prueba diferentes, ya que hace que sus módulos sean más reutilizables. Así, en proyectos de tamaño medio termino con un módulo base, que incluye todas las rutas básicas y sus controladores, servicios, directivas y submódulos más o menos complejos, cuando creo que también podrían ser útiles para otros proyectos, p. Ej. :
/******** modularizing feature-sets **********/
/controllers
/directives
/filters
/services
/my-map-sub-module
/my-map-sub-module/controllers
/my-map-sub-module/services
app.js
...
angular.module('app', [
'app.directives',
'app.filters',
'app.controllers',
'app.services',
'myMapSubModule'
]);
angular.module('myMapSubModule',[
'myMapSubModule.controllers',
'myMapSubModule.services',
// only if they are specific to the module
'myMapSubModule.directives',
'myMapSubModule.filters'
]);
Para proyectos muy grandes, a veces termino agrupando módulos por rutas, como se describió anteriormente o por algunas rutas principales seleccionadas o incluso una combinación de rutas y algunos componentes seleccionados, pero realmente depende.
EDITAR:
Solo porque está relacionado y me encontré con eso muy recientemente nuevamente: tenga mucho cuidado de crear un módulo solo una vez (agregando un segundo parámetro a la función angular.module). Esto estropeará su aplicación y puede ser muy difícil de detectar.
EDITAR 2015 sobre módulos de clasificación:
un año y medio de experiencia angular más tarde, puedo agregar que los beneficios de usar módulos con nombres diferentes dentro de su aplicación son algo limitados ya que AMD todavía no funciona bien con Angular y servicios, directivas y filtros están disponibles globalmente dentro del contexto angular de todos modos ( como se ejemplifica aquí ). Sin embargo, todavía hay un beneficio semántico y estructural y podría ser útil poder incluir / excluir un módulo con una sola línea de código comentada dentro o fuera.
También casi nunca tiene mucho sentido separar submódulos por tipo (por ejemplo, 'myMapSubModule.controllers') ya que generalmente dependen unos de otros.