'Beste' Möglichkeit, ein Modul zu deklarieren
Da Angular im globalen Bereich selbst liegt und Module in seiner Variablen gespeichert werden, können Sie auf Module zugreifen über 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){
//..
}])
})();
Es sind keine weiteren globalen Variablen erforderlich.
Natürlich hängt alles von den Vorlieben ab, aber ich denke, dies ist eine Art Best Practice
- Sie müssen den globalen Geltungsbereich nicht verschmutzen
- Sie können überall auf Ihre Module zugreifen und sie und ihre Funktionen nach Belieben in verschiedene Dateien sortieren
- Sie können die Funktionsform "use strict" verwenden.
- Die Ladereihenfolge der Dateien spielt keine Rolle
Optionen zum Sortieren Ihrer Module und Dateien
Diese Art der Deklaration und des Zugriffs auf Module macht Sie sehr flexibel. Sie können Module nach Funktionstyp (wie in einer anderen Antwort beschrieben) oder nach Route sortieren, z.
/******** sorting by route **********/
angular.module('home')...
angular.module('another-route')...
angular.module('shared')...
Wie Sie es am Ende sortieren, hängt vom persönlichen Geschmack sowie vom Umfang und der Art des Projekts ab. Ich persönlich mag es, alle Dateien eines Moduls in demselben Ordner zu gruppieren (in Unterordnern von Anweisungen, Controllern, Diensten und Filtern angeordnet), einschließlich aller verschiedenen Testdateien, da Ihre Module dadurch wiederverwendbarer werden. So habe ich in mittelgroßen Projekten ein Basismodul, das alle grundlegenden Routen und ihre Controller, Dienste, Anweisungen und mehr oder weniger komplexen Untermodule enthält, wenn ich denke, dass sie auch für andere Projekte nützlich sein könnten, z ::
/******** 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'
]);
Bei sehr großen Projekten gruppiere ich Module manchmal nach Routen, wie oben beschrieben, oder nach ausgewählten Hauptrouten oder sogar nach einer Kombination von Routen und einigen ausgewählten Komponenten, aber das hängt wirklich davon ab.
EDIT:
Nur weil es verwandt ist und ich kürzlich wieder darauf gestoßen bin: Achten Sie darauf, dass Sie ein Modul nur einmal erstellen (indem Sie der angular.module-Funktion einen zweiten Parameter hinzufügen). Dies wird Ihre Anwendung durcheinander bringen und kann sehr schwer zu erkennen sein.
2015 EDIT zum Sortieren von Modulen:
Eineinhalb Jahre Erfahrung mit Winkeln später kann ich hinzufügen, dass die Vorteile der Verwendung von Modulen mit unterschiedlichen Namen in Ihrer App etwas begrenzt sind, da AMD mit Angular und Diensten, Anweisungen und Filtern immer noch nicht wirklich gut funktioniert sind ohnehin global im Winkelkontext verfügbar ( wie hier beispielhaft dargestellt ). Es gibt jedoch immer noch einen semantischen und strukturellen Vorteil, und es kann hilfreich sein, ein Modul mit einer einzelnen Codezeile ein- oder auszuschließen, die ein- oder ausgekommentiert wird.
Es ist auch fast nie sinnvoll, Untermodule nach Typ zu trennen (z. B. 'myMapSubModule.controllers'), da sie normalerweise voneinander abhängen.