„Najlepszy” sposób na zadeklarowanie modułu
Ponieważ angular jest w samym zasięgu globalnym, a moduły są zapisywane w jego zmiennej, dostęp do modułów można uzyskać za pośrednictwem 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){
//..
}])
})();
Żadne inne zmienne globalne nie są wymagane.
Oczywiście wszystko zależy od preferencji, ale myślę, że jest to najlepsza praktyka
- nie musisz zanieczyszczać globalnego zasięgu
- możesz uzyskać dostęp do swoich modułów w dowolnym miejscu i sortować je i ich funkcje w różnych plikach
- możesz użyć formy funkcji „użyj ścisłego”;
- kolejność ładowania plików nie ma tak dużego znaczenia
Opcje sortowania modułów i plików
Ten sposób deklarowania i uzyskiwania dostępu do modułów sprawia, że jesteś bardzo elastyczny. Możesz sortować moduły według typu funkcji (jak opisano w innej odpowiedzi) lub według trasy, np .:
/******** sorting by route **********/
angular.module('home')...
angular.module('another-route')...
angular.module('shared')...
Ostateczny sposób sortowania jest kwestią gustu oraz skali i rodzaju projektu. Osobiście lubię grupować wszystkie pliki modułu w tym samym folderze (uporządkowane w podfoldery dyrektyw, kontrolerów, usług i filtrów), w tym wszystkie różne pliki testowe, ponieważ sprawia to, że twoje moduły są bardziej wielokrotnego użytku. Tak więc w projektach średniej wielkości otrzymuję moduł podstawowy, który zawiera wszystkie podstawowe trasy i ich kontrolery, usługi, dyrektywy i mniej lub bardziej złożone podmoduły, kiedy myślę, że mogą być przydatne również w innych projektach, np. :
/******** 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'
]);
W przypadku bardzo dużych projektów czasami kończę grupowanie modułów według tras, jak opisano powyżej lub według wybranych głównych tras, a nawet kombinacji tras i wybranych komponentów, ale to naprawdę zależy.
EDYCJA:
Tylko dlatego, że jest to powiązane, a ostatnio znowu na to natknąłem: Uważaj, aby utworzyć moduł tylko raz (dodając drugi parametr do funkcji angular.module). Spowoduje to zepsucie aplikacji i może być bardzo trudne do wykrycia.
EDYCJA 2015 dotycząca sortowania modułów:
Półtora roku późniejszych doświadczeń z kątami, mogę dodać, że korzyści wynikające z używania modułów o różnych nazwach w Twojej aplikacji są nieco ograniczone, ponieważ AMD nadal nie działa dobrze z Angular i usługami, dyrektywami i filtrami i tak są globalnie dostępne w kontekście kątowym ( jak pokazano tutaj na przykładzie ). Jednak nadal istnieje semantyczna i strukturalna korzyść i może być pomocne włączenie / wyłączenie modułu z jedną linią kodu skomentowaną lub usuniętą.
Również prawie nigdy nie ma sensu rozdzielanie podmodułów według typu (np. „MyMapSubModule.controllers”), ponieważ zwykle są one od siebie zależne.