AngularJS: Модули
Модуль - это набор из конфигурации и блока инициализации .run()
, которые выполняются в момент загрузки приложения. Помимо этих блоков, модуль может регистрировать сервисы, директивы и фильтры. Поэтому, я предлагаю рассмотреть простую структуру модуля, после чего перейти к расширенным возможностям. Рассмотрим структуру простого модуля..
Простой модуль
angular.module('someModule', []).
config(function(injectables) {
// Инжекция провайдеров и констант (not instances)
}).
run(function(injectables) {
// Инжекция экземпляров и констант (not providers)
});
- Блок конфигурации (Config блок)
- Выполняется во время регистрации провайдеров и фазы конфигурации. В этот блок разрешается инжектить только провайдеров (не экземпляров) и констант, во избежание случайного инстанцирования сервисов до их полной настройки. Можно зарегистрировать несколько блоков конфигурации - они будут выполнены в порядке их регистрации.
- Блок выполнения (Run блок)
- Выполняется после того, как все сервисы были настроены и создан injector. Используется для kickstart приложения. В этот блок допускается инжекция экземпляров сервисов и констант, для предотвращения дальнейшей конфигурации системы во время выполнения приложения. Можно зарегистрировать несколько блоков конфигурации. Код в
run
-блоке сложно покрывать unit-тестами, поэтому он должен быть помещен в изолированных модулях.
Расширенная структура модуля
angular.module('someModule', []).
constant('constName', 'обычно объект').
value('valueName', 'обычно объект').
factory('someFactory', function() { return 'сервис'; }).
directive('someDirective', ...).
filter('someFilter', ...);
// аналогично:
angular.module('myModule', []).
config(function($provide, $compileProvider, $filterProvider) {
// Константы не могут быть определены внутри блока конфигурации!
$provide.value('valueName', 'обычно объект');
$provide.factory('someFactory', function() { return 'сервис'; });
$compileProvider.directive('someDirective', ...);
$filterProvider.register('someFilter', ...);
});
- Зависимости
- Модули могут иметь зависимости от других модулей, которые должны быть загружены до зависящего модуля. Каждый модуль будет загружен только один раз, даже если он указан в зависимостях нескольких модулей.
Внимание!
Для переопределения существующего модуля необходимо передать массив параметров, даже пустой. Чтобы получить существующий модуль - указывайте только его имя:
angular.module('someModule'); // получение существующего модуля
angular.module('someModule', []); // перезапись существующиего модуля