AngularJS: Модули

Категория: 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', []); // перезапись существующиего модуля


категория: AngularJS