API NgModule¶
28.02.2022
На высоком уровне NgModules — это способ организации Angular-приложений, который достигается за счет метаданных в декораторе @NgModule
. Метаданные делятся на три категории:
Категория | Подробности |
---|---|
Static | Конфигурация компилятора, которая сообщает компилятору о селекторах директив и о том, где в шаблонах эти директивы должны быть применены через сопоставление селекторов. Эта конфигурация задается с помощью массива declarations . |
Runtime | Конфигурация инжектора с помощью массива providers . |
Composability / Grouping | Объединение NgModules и обеспечение их доступности с помощью массивов imports и exports . |
1 2 3 4 5 6 7 8 9 10 11 |
|
Метаданные @NgModule
¶
Далее приведены свойства метаданных @NgModule
.
declarations
¶
Список декларируемых классов (компонентов, директив и пайпов), которые принадлежат данному модулю.
- При компиляции шаблона необходимо определить набор селекторов, которые должны использоваться для запуска соответствующих им директив.
- Шаблон компилируется в контексте NgModule — того NgModule, в котором объявлен компонент шаблона — который определяет набор селекторов по следующим правилам:
- Все селекторы директив, перечисленных в
declarations
. - Все селекторы директив, экспортированных из импортированных NgModules.
- Все селекторы директив, перечисленных в
Компоненты, директивы и пайпы должны принадлежать точно одному модулю. При попытке объявить один и тот же класс более чем в одном модуле компилятор выдает ошибку. Будьте осторожны и не объявляйте повторно класс, который прямо или косвенно импортируется из другого модуля.
providers
¶
Список провайдеров инжекции зависимостей.
Angular регистрирует эти провайдеры в инжекторе NgModule. Если это NgModule, используемый для bootstrapping, то это корневой инжектор.
Эти сервисы становятся доступными для инжекции в любой компонент, директиву, пайп или сервис, являющийся дочерним по отношению к этому инжектору.
Лениво загружаемый модуль имеет свой собственный инжектор, который обычно является дочерним по отношению к корневому инжектору приложения.
Сервисы, загружаемые ленивым модулем, привязываются к инжектору ленивого модуля. Если лениво загружаемый модуль также предоставляет UserService
, то любой компонент, созданный в контексте этого модуля (например, при навигации по маршрутизатору), получает локальный экземпляр сервиса, а не экземпляр в инжекторе корневого приложения.
Компоненты во внешних модулях продолжают получать экземпляр, предоставленный их инжекторами.
Более подробную информацию об иерархии инжекторов и их масштабировании можно найти в Providers и в DI Guide.
imports
¶
Список модулей, которые должны быть свернуты в данный модуль. Сложить — это значит, как если бы все экспортируемые свойства импортируемого модуля NgModule были объявлены здесь.
Точнее, как если бы в этом модуле был объявлен список модулей, на экспортируемые компоненты, директивы или пайпы которых ссылаются шаблоны компонентов.
Шаблон компонента может ссылаться на другой компонент, директиву или пайп, если ссылка объявлена в этом модуле или если импортируемый модуль экспортировал его. Например, компонент может использовать директивы NgIf
и NgFor
только в том случае, если модуль импортировал Angular CommonModule
(возможно, косвенно, путем импорта BrowserModule
).
Многие стандартные директивы можно импортировать из CommonModule
, но некоторые знакомые директивы принадлежат другим модулям. Например, использовать [(ngModel)]
можно только после импорта модуля Angular FormsModule
.
exports
¶
Список деклараций — компонентных, директивных и трубных классов — которые может использовать импортирующий модуль.
Экспортируемые декларации являются публичным API модуля. Компонент другого модуля может использовать UserComponent
этого модуля, если он импортирует этот модуль и этот модуль экспортирует UserComponent
.
По умолчанию декларации являются приватными. Если этот модуль не экспортирует UserComponent
, то только компоненты внутри модуля this могут использовать UserComponent
.
Импорт модуля не приводит к автоматическому реэкспорту импортов импортируемого модуля. Модуль 'B' не может использовать ngIf
только потому, что он импортировал модуль 'A', который импортировал CommonModule
. Модуль 'B' должен сам импортировать CommonModule
.
Модуль может перечислить другой модуль среди своих экспортов
, и тогда все публичные компоненты, директивы и пайпы этого модуля будут экспортированы.
Re-export делает транзитивность модулей явной. Если модуль 'A' реэкспортирует CommonModule
, а модуль 'B' импортирует модуль 'A', то компоненты модуля 'B' могут использовать ngIf
, даже если сам модуль 'B' не импортировал CommonModule
.
bootstrap
¶
Список компонентов, которые автоматически загружаются.
Обычно в этом списке присутствует только один компонент — корневой компонент приложения.
Angular может запускаться с несколькими компонентами bootstrap, каждый из которых имеет свое собственное местоположение на главной веб-странице.
Подробнее о NgModules¶
Возможно, вас также заинтересует следующее: