Я пытаюсь понять Angular (иногда называемый Angular2 +), затем я наткнулся @Module
:
импорт
Объявления
Провайдеры
После углового быстрого старта
Я пытаюсь понять Angular (иногда называемый Angular2 +), затем я наткнулся @Module
:
импорт
Объявления
Провайдеры
После углового быстрого старта
Ответы:
Угловые понятия
imports
делает экспортированные объявления других модулей доступными в текущем модулеdeclarations
должны сделать директивы (включая компоненты и трубы) из текущего модуля доступными для других директив в текущем модуле. Селекторы директив, компонентов или каналов сопоставляются только с HTML, если они объявлены или импортированы.providers
должны сделать сервисы и значения известными DI (внедрение зависимости). Они добавляются в корневую область и внедряются в другие службы или директивы, которые имеют их в качестве зависимости.Особый случай providers
- лениво загруженные модули, которые получают собственный дочерний инжектор. providers
модуля с отложенной загрузкой по умолчанию предоставляются только этому загруженному модулю (но не всему приложению, как с другими модулями).
Для получения дополнительной информации о модулях см. Также https://angular.io/docs/ts/latest/guide/ngmodule.html.
exports
делает компоненты, директивы и каналы доступными в модулях, к которым добавляется этот модуль imports
. exports
может также использоваться для реэкспорта модулей, таких как CommonModule и FormsModule, что часто делается в общих модулях.
entryComponents
регистрирует компоненты для автономной компиляции, чтобы их можно было использовать с ViewContainerRef.createComponent()
. Компоненты, используемые в конфигурациях маршрутизатора, добавляются неявно.
Импорт TypeScript (ES2015)
import ... from 'foo/bar'
(который может разрешить вindex.ts
) для импорта TypeScript. Они нужны вам всякий раз, когда вы используете идентификатор в файле машинописного текста, который объявлен в другом файле машинописного текста.
Angular @NgModule()
imports
и TypeScript import
- это совершенно разные понятия .
См. Также jDriven - синтаксис импорта TypeScript и ES6
Большинство из них на самом деле представляют собой простой синтаксис модуля ECMAScript 2015 (ES6), который также используется в TypeScript.
import
Следует упомянуть, что afaik - это функциональность JS (ES2015), а не TypeScript. :)
imports
, но экспортировать ваши деклараторы (компонент, директива, труба) с exports
. Итак, основными целями imports
и exports
являются разные вещи. Вместо этого главная цель exports
- ваша declarations
. Вы объявляете свой компонент с помощью declarations
, но для динамически загружаемого компонента вам необходимо вставить их entryComponents
. Тем временем providers
DI управляет другой историей.
imports
используются для импорта вспомогательных модулей, таких как FormsModule, RouterModule, CommonModule или любого другого пользовательского функционального модуля.
declarations
используются для объявления компонентов, директив, каналов, которые принадлежат текущему модулю. Все внутри деклараций знают друг друга. Например, если у нас есть компонент, скажем UsernameComponent, который отображает список имен пользователей, и у нас также есть канал, скажем toupperPipe, который преобразует строку в строку заглавных букв. Теперь, если мы хотим отображать имена пользователей заглавными буквами в нашем компоненте UsernameComponent, тогда мы можем использовать созданную ранее toupperPipe, но вопрос в том, как UsernameComponent знает, что существует toupperPipe, и как он может получить к нему доступ и использовать его. Здесь идут объявления, мы можем объявить UsernameComponent и toupperPipe.
Providers
используются для введения услуг, требуемых компонентами, директивами, трубами в модуле.
Компоненты объявлены, Модули импортированы, и Услуги предоставляются. Пример, с которым я работаю:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import {FormsModule} from '@angular/forms';
import { UserComponent } from './components/user/user.component';
import { StateService } from './services/state.service';
@NgModule({
declarations: [
AppComponent,
UserComponent
],
imports: [
BrowserModule,
FormsModule
],
providers: [ StateService ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
@NgModule
конструкции:import { x } from 'y';
: Это стандартный синтаксис машинного текста ( ES2015/ES6
модульный синтаксис) для импорта кода из других файлов. Это не специфично для Angular . Кроме того, это технически не является частью модуля, просто необходимо получить необходимый код в рамках этого файла.imports: [FormsModule]
: Вы импортируете другие модули здесь. Например, мы импортируем FormsModule
в примере ниже. Теперь мы можем использовать функциональные возможности, которые FormsModule предлагает в этом модуле.declarations: [OnlineHeaderComponent, ReCaptcha2Directive]
: Вы помещаете свои компоненты, директивы и трубы здесь. После объявления здесь вы можете использовать их во всем модуле. Например, теперь мы можем использовать OnlineHeaderComponent
в AppComponent
представлении (HTML-файл). Angular знает, где это найти, OnlineHeaderComponent
потому что он объявлен в @NgModule
.providers: [RegisterService]
: Здесь определяются наши сервисы этого конкретного модуля. Вы можете использовать службы в своих компонентах, внедрив их с помощью внедрения зависимостей.// Angular
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
// Components
import { AppComponent } from './app.component';
import { OfflineHeaderComponent } from './offline/offline-header/offline-header.component';
import { OnlineHeaderComponent } from './online/online-header/online-header.component';
// Services
import { RegisterService } from './services/register.service';
// Directives
import { ReCaptcha2Directive } from './directives/re-captcha2.directive';
@NgModule({
declarations: [
OfflineHeaderComponent,,
OnlineHeaderComponent,
ReCaptcha2Directive,
AppComponent
],
imports: [
BrowserModule,
FormsModule,
],
providers: [
RegisterService,
],
entryComponents: [
ChangePasswordComponent,
TestamentComponent,
FriendsListComponent,
TravelConfirmComponent
],
bootstrap: [AppComponent]
})
export class AppModule { }
Добавление быстрого шпаргалки, которая может помочь после долгого перерыва с Angular:
Пример:
declarations: [AppComponent]
Что мы можем здесь ввести? Компоненты, трубы, директивы
Пример:
imports: [BrowserModule, AppRoutingModule]
Что мы можем здесь ввести? другие модули
Пример:
providers: [UserService]
Что мы можем здесь ввести? Сервисы
Пример:
bootstrap: [AppComponent]
Что мы можем здесь ввести? основной компонент, который будет сгенерирован этим модулем (верхний родительский узел для дерева компонентов)
Пример:
entryComponents: [PopupComponent]
Что мы можем здесь ввести? динамически генерируемые компоненты (например, с помощью ViewContainerRef.createComponent ())
Пример:
export: [TextDirective, PopupComponent, BrowserModule]
Что мы можем здесь ввести? компоненты, директивы, модули или каналы, к которым мы хотели бы иметь доступ в другом модуле (после импорта этого модуля)
forRoot()
в модуль с ленивой загрузкой. Ты согласен? Смотрите основной модуль . Ссылка на # shared-module-for-root больше не существует.