Я намагаюся зрозуміти 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'
(що може відповідати anindex.ts
) призначені для імпорту TypeScript. Вони потрібні вам щоразу, коли ви використовуєте ідентифікатор у файлі машинопису, який оголошується в іншому файлі.
Angular's @NgModule()
imports
і TypeScript import
- абсолютно різні поняття .
Див. Також синтаксис імпорту jDriven - TypeScript та ES6
Більшість з них насправді є простим синтаксисом модулів ECMAScript 2015 (ES6), який використовує TypeScript.
import
- це функція JS (ES2015), а не TypeScript. :)
imports
, але експортувати свої декларувані елементи (компонент, директива, труба) за допомогою exports
. Отже, головні цілі imports
та exports
різні речі. Натомість головна мета exports
- ваше declarations
. Ви оголошуєте свій компонент за допомогою declarations
, але для динамічного завантаженого компонента вам потрібно їх вставити entryComponents
. Тим часом, providers
керовані в іншій історії DI 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
модуля) для імпорту коду з інших файлів. Це не кутовий характер . Також це технічно не є частиною модуля, просто необхідно отримати необхідний код у межах цього файлу.imports: [FormsModule]
: Ви імпортуєте сюди інші модулі. Наприклад, ми імпортуємо FormsModule
в наведеному нижче прикладі. Тепер ми можемо використовувати функціонал, який може запропонувати FormsModule протягом цього модуля.declarations: [OnlineHeaderComponent, ReCaptcha2Directive]
: Ви розміщуєте тут свої компоненти, директиви та труби. Після оголошення тут ви тепер можете використовувати їх у всьому модулі. Наприклад, тепер ми можемо використовувати OnlineHeaderComponent
в AppComponent
представленні (html-файл). Кутовий знає, де це знайти, 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 більше не існує.