Il modo "migliore" per dichiarare un modulo
Poiché angular si trova sull'ambito globale stesso ei moduli vengono salvati nella sua variabile, è possibile accedere ai moduli tramite 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){
//..
}])
})();
Non sono necessarie altre variabili globali.
Ovviamente dipende tutto dalle preferenze, ma penso che questa sia una specie di best practice, come
- non devi inquinare l'ambito globale
- puoi accedere ai tuoi moduli ovunque e ordinarli e le loro funzioni in file diversi a piacimento
- puoi usare la forma-funzione di "use strict";
- l'ordine di caricamento dei file non è così importante
Opzioni per ordinare i tuoi moduli e file
Questo modo di dichiarare e accedere ai moduli ti rende molto flessibile. Puoi ordinare i moduli tramite il tipo di funzione (come descritto in un'altra risposta) o tramite route, ad esempio:
/******** sorting by route **********/
angular.module('home')...
angular.module('another-route')...
angular.module('shared')...
Il modo in cui lo ordinate alla fine è una questione di gusti personali, della scala e del tipo di progetto. Personalmente mi piace raggruppare tutti i file di un modulo all'interno della stessa cartella (ordinati in sottocartelle di direttive, controller, servizi e filtri), inclusi tutti i diversi file di test, in quanto rende i moduli più riutilizzabili. Quindi nei progetti di medie dimensioni mi ritrovo con un modulo di base, che include tutti i percorsi di base ei loro controller, servizi, direttive e sottomoduli più o meno complessi, quando penso che potrebbero essere utili anche per altri progetti, ad es. :
/******** 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'
]);
Per progetti molto grandi, a volte finisco per raggruppare i moduli per rotte, come descritto sopra o per alcune rotte principali selezionate o anche una combinazione di rotte e alcuni componenti selezionati, ma dipende davvero.
EDIT:
Solo perché è correlato e mi sono imbattuto di nuovo in quello molto recentemente: fai molta attenzione a creare un modulo solo una volta (aggiungendo un secondo parametro alla funzione angular.module). Questo rovinerà la tua applicazione e può essere molto difficile da rilevare.
2015 MODIFICA sui moduli di ordinamento:
un anno e mezzo di esperienza angolare dopo, posso aggiungere che i vantaggi derivanti dall'utilizzo di moduli con nomi diversi all'interno della tua app sono in qualche modo limitati in quanto AMD non funziona ancora bene con Angular e servizi, direttive e filtri sono comunque globalmente disponibili all'interno del contesto angolare ( come esemplificato qui ). C'è ancora un vantaggio semantico e strutturale e potrebbe essere utile poter includere / escludere un modulo con una singola riga di codice commentata dentro o fuori.
Inoltre, non ha quasi mai molto senso separare i sottomoduli in base al tipo (es. "MyMapSubModule.controllers") poiché di solito dipendono l'uno dall'altro.