Angular 模塊是帶有 @NgModule 裝飾器函數的類。 @NgModule接收一個元數據對象,該對象告訴 Angular 如何編譯和運行模塊代碼。 它標記出該模塊擁有的組件、指令和管道, 並把它們的一部分公開出去,以便外部組件使用它們。 它能夠嚮應用的依賴注入器中添加服務提供商。html
每一個 Angular 應用都有一個根模塊類。 按照約定,它的類名叫作AppModule,被放在app.module.ts文件中。bootstrap
src/app/app.module.ts (minimal) import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { AppComponent } from './app.component'; @NgModule({ imports: [ BrowserModule ], declarations: [ AppComponent ], bootstrap: [ AppComponent ] }) export class AppModule { }
下面範例AppComponent顯示被綁定的標題:瀏覽器
src/app/app.component.ts (minimal) import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: '<h1>{{title}}</h1>', }) export class AppComponent { title = 'Minimal NgModule'; }
src/main.ts (dynamic) import { enableProdMode } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; if (environment.production) { enableProdMode(); } platformBrowserDynamic().bootstrapModule(AppModule);
預編譯器 (AoT - Ahead-Of-Time) 進行靜態引導網絡
src/main.ts (static) // The browser platform without a compiler import { platformBrowser } from '@angular/platform-browser'; // The app module factory produced by the static offline compiler import { AppModuleNgFactory } from './app/app.module.ngfactory'; // Launch with the app module factory. platformBrowser().bootstrapModuleFactory(AppModuleNgFactory);
src/app/title.component.html (ngIf) <p *ngIf="user"> <i>Welcome, {{user}}</i> <p>
src/app/app.module.ts (imports) imports: [ BrowserModule ],
若是有兩個同名指令,都叫作HighlightDirective,該怎麼辦呢?咱們只要在 import 時使用as關鍵字來爲第二個指令建立個別名就能夠了。app
src/app/app.module.1b.ts import { HighlightDirective as ContactHighlightDirective } from './contact/highlight.directive';
當兩個指令在同一個元素上爭相設置顏色時,後聲明的那個會勝出,由於它對 DOM 的修改覆蓋了前一個ide
src/app/highlight.directive.ts import { Directive, ElementRef } from '@angular/core'; @Directive({ selector: '[highlight]' }) /** Highlight the attached element in gold */ export class HighlightDirective { constructor(el: ElementRef) { el.nativeElement.style.backgroundColor = 'gold'; console.log( `* AppRoot highlight called for ${el.nativeElement.tagName}`); } }
src/app/contact/highlight.directive.ts import { Directive, ElementRef } from '@angular/core'; @Directive({ selector: '[highlight], input' }) /** Highlight the attached element or an InputElement in blue */ export class HighlightDirective { constructor(el: ElementRef) { el.nativeElement.style.backgroundColor = 'powderblue'; console.log( `* Contact highlight called for ${el.nativeElement.tagName}`); } }
它們在技術上有兩個顯著的不一樣點:函數
src/app/app.component.ts (v3 - Template) template: ` <app-title [subtitle]="subtitle"></app-title> <nav> <a routerLink="contact" routerLinkActive="active">Contact</a> <a routerLink="crisis" routerLinkActive="active">Crisis Center</a> <a routerLink="heroes" routerLinkActive="active">Heroes</a> </nav> <router-outlet></router-outlet> `
src/app/app-routing.module.ts import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; export const routes: Routes = [ { path: '', redirectTo: 'contact', pathMatch: 'full'}, { path: 'crisis', loadChildren: 'app/crisis/crisis.module#CrisisModule' }, { path: 'heroes', loadChildren: 'app/hero/hero.module#HeroModule' } ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule {}
src/app/app-routing.module.ts { path: 'crisis', loadChildren: 'app/crisis/crisis.module#CrisisModule' }, { path: 'heroes', loadChildren: 'app/hero/hero.module#HeroModule' }
咱們添加SharedModule來存放這些公共組件、指令和管道,而且共享給那些須要它們的模塊工具
import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { AwesomePipe } from './awesome.pipe'; import { HighlightDirective } from './highlight.directive'; @NgModule({ imports: [ CommonModule ], declarations: [ AwesomePipe, HighlightDirective ], exports: [ AwesomePipe, HighlightDirective, CommonModule, FormsModule ] }) export class SharedModule { }
值得注意的有:性能
咱們能夠把一些組件收集到單獨的CoreModule中,而且只在應用啓動時導入它一次,而不會在其它地方導入它code
模塊的靜態方法forRoot能夠同時提供並配置服務,它接收一個服務配置對象,並返回一個ModuleWithProviders。這個簡單對象具備兩個屬性:
根模塊AppModule會導入CoreModule類並把它的providers添加到AppModule的服務提供商中,更精確的說法是,Angular 會先累加全部導入的提供商,而後才把它們追加到@NgModule.providers中, 這樣能夠確保咱們顯式添加到AppModule中的那些提供商老是優先於從其它模塊中導入的提供商
src/app/core/core.module.ts constructor (@Optional() @SkipSelf() parentModule: CoreModule) { if (parentModule) { throw new Error( 'CoreModule is already loaded. Import it in the AppModule only'); } }