'Лучший' способ объявить модуль
Поскольку angular находится в самой глобальной области видимости, а модули сохраняются в его переменной, вы можете получить доступ к модулям через 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){
//..
}])
})();
Никаких других глобальных переменных не требуется.
Конечно, все зависит от предпочтений, но я думаю, что это лучшая практика, поскольку
- вам не нужно загрязнять глобальную область видимости
- вы можете получить доступ к своим модулям повсюду и по желанию сортировать их и их функции в разные файлы
- вы можете использовать функциональную форму «use strict»;
- порядок загрузки файлов не имеет большого значения
Варианты сортировки ваших модулей и файлов
Такой способ объявления модулей и доступа к ним делает вас очень гибкими. Вы можете сортировать модули по типу функции (как описано в другом ответе) или по маршруту, например:
/******** sorting by route **********/
angular.module('home')...
angular.module('another-route')...
angular.module('shared')...
Как вы это сортируете в конечном итоге - дело личного вкуса, а также масштаба и типа проекта. Мне лично нравится группировать все файлы модуля внутри одной и той же папки (упорядоченные по подпапкам директив, контроллеров, служб и фильтров), включая все различные тестовые файлы, поскольку это делает ваши модули более пригодными для повторного использования. Таким образом, в проектах среднего размера я получаю базовый модуль, который включает в себя все основные маршруты и их контроллеры, службы, директивы и более или менее сложные подмодули, когда я думаю, что они могут быть полезны и для других проектов, например :
/******** 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'
]);
Для очень больших проектов я иногда группирую модули по маршрутам, как описано выше, или по некоторым выбранным основным маршрутам, или даже по комбинации маршрутов и некоторых выбранных компонентов, но это действительно зависит.
РЕДАКТИРОВАТЬ:
Просто потому, что это связано, и я снова столкнулся с этим совсем недавно: позаботьтесь о том, чтобы вы создавали модуль только один раз (добавив второй параметр в функцию angular.module). Это испортит ваше приложение, и его будет очень сложно обнаружить.
2015 РЕДАКТИРОВАТЬ модули сортировки:
полтора года опыта работы с angular спустя я могу добавить, что преимущества от использования модулей с разными именами в вашем приложении несколько ограничены, поскольку AMD по-прежнему плохо работает с Angular и службами, директивами и фильтрами. в любом случае доступны глобально в контексте angular ( как показано здесь ). Тем не менее, есть семантическое и структурное преимущество, и может быть полезна возможность включать / исключать модуль с одной строкой кода, закомментированной или удаленной.
Также почти никогда не имеет смысла разделять подмодули по типу (например, «myMapSubModule.controllers»), поскольку они обычно зависят друг от друга.