Яка різниця між деклараціями, постачальниками та імпортом у NgModule?


Відповіді:


516

Кутові поняття

  • 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.


1
Я думаю, але я не впевнений, що остання рекомендація - розміщувати провайдери для додатків у CoreModule, а не використовувати forRoot()в ледачому завантаженому модулі. Ви згодні? Див . Основний модуль . Посилання на # shared-module-for-root більше не існує.
Марк Райчкок

1
Відмінне пояснення. Дякую, @ günter-zöchbauer. Зазначимо лише, що afaik import- це функція JS (ES2015), а не TypeScript. :)
cassi.lup

і що таке експорт [] в NgModule смоктати як експорт: [MatCheckBox]
Омар Ісаїд

4
Якщо чесно, я думаю, що дизайн NgModule of Angular незграбний і незрозумілий у порівнянні з Vue та React . Вам потрібно імпортувати інший модуль з imports, але експортувати свої декларувані елементи (компонент, директива, труба) за допомогою exports. Отже, головні цілі importsта exportsрізні речі. Натомість головна мета exports- ваше declarations. Ви оголошуєте свій компонент за допомогою declarations, але для динамічного завантаженого компонента вам потрібно їх вставити entryComponents. Тим часом, providersкеровані в іншій історії DI DI.
xuemind

1
перекручена відповідь, що описує перекручені рамки
Донато

85

imports використовуються для імпорту підтримуючих модулів, таких як FormsModule, RouterModule, CommonModule або будь-який інший на замовлення функціональний модуль.

declarationsвикористовуються для оголошення компонентів, директив, труб, що належать до поточного модуля. Усі всередині декларацій знають один одного. Наприклад, якщо у нас є компонент, скажімо UsernameComponent, який відображає список імен користувачів, а у нас також є труба, скажімо, toupperPipe, яка перетворює рядок у верхній регістр літер. Тепер, якщо ми хочемо показувати імена користувачів великими літерами в нашому UsernameComponent, тоді ми можемо використовувати toupperPipe, який ми створили раніше, але питання полягає в тому, як UsernameComponent знає, що toupperPipe існує і як він може отримати доступ та використовувати це. Ось приходять декларації, ми можемо оголосити UsernameComponent і toupperPipe.

Providers використовуються для введення послуг, необхідних компонентам, директивам, трубам в модулі.


3
"декларації: використовується для оголошення компонентів, директив, труб, що належать до поточного модуля. Все, що знаходиться всередині декларацій, знає один одного." це має бути прийнята відповідь
Дін Джон,

60

Компоненти оголошуються, модулі імпортуються та надаються Послуги. Приклад, з яким я працюю:

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 { }

3
Мені подобається простота цього пояснення, але мене не цікавить, чому не існує лише одного властивості "stuffsThisComponentNeeds"? Схоже, всі вони мають справу з тим самим, що робить інші фрагменти коду доступними для поточного компонента.
redO жовтня13

1
@ redO жовтня13 Я згоден. Наприклад, у Node.js все імпортується однаково, незалежно від того, це модель DB2, модуль, сервіс DB або встановлений сторонній пакет. І я думаю, те саме відбувається і з reactJS
SanSolo

18

Кутові @NgModuleконструкції:

  1. import { x } from 'y';: Це стандартний синтаксис машинопису (синтаксис ES2015/ES6модуля) для імпорту коду з інших файлів. Це не кутовий характер . Також це технічно не є частиною модуля, просто необхідно отримати необхідний код у межах цього файлу.
  2. imports: [FormsModule]: Ви імпортуєте сюди інші модулі. Наприклад, ми імпортуємо FormsModuleв наведеному нижче прикладі. Тепер ми можемо використовувати функціонал, який може запропонувати FormsModule протягом цього модуля.
  3. declarations: [OnlineHeaderComponent, ReCaptcha2Directive]: Ви розміщуєте тут свої компоненти, директиви та труби. Після оголошення тут ви тепер можете використовувати їх у всьому модулі. Наприклад, тепер ми можемо використовувати OnlineHeaderComponentв AppComponentпредставленні (html-файл). Кутовий знає, де це знайти, OnlineHeaderComponentтому що це оголошено в @NgModule.
  4. 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 { }

10

Додавання швидкої шпаргалки, яка може допомогти після тривалої перерви з Angular:


ДЕКЛАРАЦІЇ

Приклад:

declarations: [AppComponent]

Що ми можемо тут ввести? Компоненти, труби, директиви


ІМПОРТ

Приклад:

imports: [BrowserModule, AppRoutingModule]

Що ми можемо тут ввести? інші модулі


ПОСТАВЧИКИ

Приклад:

providers: [UserService]

Що ми можемо тут ввести? послуги


BOOTSTRAP

Приклад:

bootstrap: [AppComponent]

Що ми можемо тут ввести? основний компонент, який буде генерований цим модулем (верхній батьківський вузол для компонентного дерева)


ВХІД КОМПОНЕНТИ

Приклад:

entryComponents: [PopupComponent]

Що ми можемо тут ввести? динамічно генеровані компоненти (наприклад, за допомогою ViewContainerRef.createComponent ())


ЕКСПОРТ

Приклад:

export: [TextDirective, PopupComponent, BrowserModule]

Що ми можемо тут ввести? компоненти, директиви, модулі або труби, до яких ми хотіли б мати доступ до них в іншому модулі (після імпорту цього модуля)


1
А як щодо експорту?
lugte098

@ lugte098 Я додав експорт до цього списку
Przemek Struciński

Я люблю цей макет за пояснення, дуже засвоюваний. Дякую!
Аарон Йордан

1
  1. декларації : ця властивість розповідає про компоненти, директиви та труби, що належать до цього модуля.
  2. Експорт : Підмножина декларацій, які мають бути видимими та корисними у шаблонах компонентів інших NgModules.
  3. імпорт : інші модулі, експортовані класи яких потрібні шаблонам компонентів, задекларованим у цьому NgModule.
  4. провайдери : Творці послуг, які цей NgModule сприяє глобальній колекції послуг; вони стають доступними у всіх частинах програми. (Ви також можете вказати провайдерів на рівні компонентів, що часто бажано.)
  5. bootstrap : основний вигляд програми, який називається кореневим компонентом, який розміщує всі інші представлення програм. Тільки кореневий NgModule повинен встановлювати властивість завантажувальної програми.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.