ฉันพยายามเข้าใจ Angular (บางครั้งเรียกว่า Angular2 +) จากนั้นฉันเจอ@Module
:
นำเข้า
การประกาศ
ผู้ให้บริการ
ฉันพยายามเข้าใจ Angular (บางครั้งเรียกว่า Angular2 +) จากนั้นฉันเจอ@Module
:
นำเข้า
การประกาศ
ผู้ให้บริการ
คำตอบ:
แนวคิดเชิงมุม
imports
ทำให้การประกาศที่ถูกเอ็กซ์พอร์ตของโมดูลอื่นพร้อมใช้งานในโมดูลปัจจุบันdeclarations
จะทำให้คำสั่ง (รวมถึงส่วนประกอบและท่อ) จากโมดูลปัจจุบันพร้อมใช้งานกับคำสั่งอื่น ๆ ในโมดูลปัจจุบัน ตัวเลือกคำสั่งส่วนประกอบหรือท่อจะจับคู่กับ HTML เท่านั้นหากมีการประกาศหรือนำเข้าproviders
เพื่อให้บริการและค่านิยมที่รู้จักกับ DI (การฉีดพึ่งพา) พวกเขาจะถูกเพิ่มเข้าไปในขอบเขตของรูทและถูกส่งไปยังบริการหรือคำสั่งอื่น ๆ ที่มีการพึ่งพากรณีพิเศษสำหรับproviders
โมดูลที่โหลดขี้เกียจที่ได้รับหัวฉีดลูกของตัวเอง providers
ของโมดูลที่โหลดแบบ lazy ถูกจัดเตรียมไว้ให้กับโมดูลที่โหลดแบบ lazy นี้โดยดีฟอลต์ (ไม่ใช่แอ็พพลิเคชันทั้งหมดเช่นเดียวกับโมดูลอื่น ๆ )
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับโมดูลโปรดดูที่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 คุณต้องการสิ่งเหล่านี้ทุกครั้งที่คุณใช้ตัวระบุในไฟล์ typescript ที่ถูกประกาศในไฟล์ typescript อื่น
ของเชิงมุม @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
imports
ใช้เพื่ออิมพอร์ตโมดูลที่สนับสนุนเช่น FormsModule, RouterModule, CommonModule หรือโมดูลคุณลักษณะที่กำหนดเองอื่น ๆ
declarations
ใช้ในการประกาศส่วนประกอบคำสั่งท่อที่เป็นของโมดูลปัจจุบัน ทุกคนภายในการประกาศรู้ซึ่งกันและกัน ตัวอย่างเช่นหากเรามีส่วนประกอบให้พูดชื่อผู้ใช้งานซึ่งแสดงรายการชื่อผู้ใช้และเรายังมีไพพ์เช่นกันพูดว่า toupperPipe ซึ่งแปลงสตริงเป็นสตริงตัวอักษรตัวพิมพ์ใหญ่ ตอนนี้ถ้าเราต้องการแสดงชื่อผู้ใช้ด้วยตัวอักษรตัวพิมพ์ใหญ่ในชื่อผู้ใช้ของเราเราสามารถใช้ toupperPipe ซึ่งเราได้สร้างไว้ก่อนหน้านี้ แต่คำถามคือ UsernameComponent รู้ได้อย่างไรว่า toupperPipe นั้นมีอยู่จริงและสามารถเข้าถึงและใช้งานได้อย่างไร การประกาศมาที่นี่เราสามารถประกาศชื่อผู้ใช้ส่วนประกอบและ 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';
: นี่คือไวยากรณ์ typescript มาตรฐาน ( ES2015/ES6
ไวยากรณ์โมดูล) สำหรับการนำเข้ารหัสจากไฟล์อื่น ๆ นี้ไม่ได้เป็นเฉพาะเชิงมุม นอกจากนี้เทคนิคนี้ไม่ได้เป็นส่วนหนึ่งของโมดูลมันก็แค่จำเป็นต้องได้รับรหัสที่จำเป็นภายในขอบเขตของไฟล์นี้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 อีกต่อไป