'Meilleure' façon de déclarer un module
Comme angular est sur la portée globale elle-même et que les modules sont enregistrés dans sa variable, vous pouvez accéder aux modules via 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){
//..
}])
})();
Aucune autre variable globale n'est requise.
Bien sûr, tout dépend des préférences, mais je pense que c'est en quelque sorte la meilleure pratique, car
- vous n'avez pas à polluer la portée mondiale
- vous pouvez accéder à vos modules partout et les trier ainsi que leurs fonctions dans différents fichiers à volonté
- vous pouvez utiliser la forme-fonction de "use strict";
- l'ordre de chargement des fichiers n'a pas autant d'importance
Options de tri de vos modules et fichiers
Cette façon de déclarer et d'accéder aux modules vous rend très flexible. Vous pouvez trier les modules par type de fonction (comme décrit dans une autre réponse) ou par route, par exemple:
/******** sorting by route **********/
angular.module('home')...
angular.module('another-route')...
angular.module('shared')...
La façon dont vous le triez à la fin est une question de goût personnel, de l'échelle et du type du projet. J'aime personnellement regrouper tous les fichiers d'un module dans le même dossier (classés dans des sous-dossiers de directives, de contrôleurs, de services et de filtres), y compris tous les différents fichiers de test, car cela rend vos modules plus réutilisables. Ainsi, dans les projets de taille moyenne, je me retrouve avec un module de base, qui comprend toutes les routes de base et leurs contrôleurs, services, directives et sous-modules plus ou moins complexes, alors que je pense qu'ils pourraient également être utiles pour d'autres projets, par exemple :
/******** 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'
]);
Pour les très gros projets, je finis parfois par regrouper les modules par routes, comme décrit ci-dessus ou par certaines routes principales sélectionnées ou même une combinaison de routes et de certains composants sélectionnés, mais cela dépend vraiment.
EDIT:
Juste parce que c'est lié et que je suis tombé dessus très récemment: veillez à ne créer un module qu'une seule fois (en ajoutant un deuxième paramètre à la fonction angular.module). Cela gâchera votre application et peut être très difficile à détecter.
2015 EDIT sur les modules de tri:
Un an et demi d'expérience angulaire plus tard, je peux ajouter que les avantages de l'utilisation de modules nommés différemment dans votre application sont quelque peu limités car AMD ne fonctionne toujours pas vraiment bien avec Angular et les services, directives et filtres sont globalement disponibles dans le contexte angulaire de toute façon ( comme illustré ici ). Cependant, il y a toujours un avantage sémantique et structurel et il pourrait être utile de pouvoir inclure / exclure un module avec une seule ligne de code commentée dans ou hors.
Il n'est également presque jamais très logique de séparer les sous-modules par type (par exemple, «myMapSubModule.controllers») car ils dépendent généralement les uns des autres.