top
Loading...
Angular 2 架構

Angular 2 架構

Angular 2 應用程序應用主要由以下 8 個部分組成:

  • 1、模塊 (Modules)
  • 2、組件 (Components)
  • 3、模板 (Templates)
  • 4、元數據 (Metadata)
  • 5、數據綁定 (Data Binding)
  • 6、指令 (Directives)
  • 7、服務 (Services)
  • 8、依賴注入 (Dependency Injection)

下圖展示了每個部分是如何相互工作的:

圖中的模板 (Templates)是由 Angular 擴展的 HTML 語法組成,組件 (Components)類用來管理這些模板,應用邏輯部分通過服務 (Services)來完成,然後在模塊中打包服務與組件,最後通過引導根模塊來啟動應用。

接下來我們會對以上 8 個部分分開解析:


模塊

模塊由一塊代碼組成,可用於執行一個簡單的任務。

Angular 應用是由模塊化的,它有自己的模塊系統:NgModules。

每個 Angular 應該至少要有一個模塊(根模塊),一般可以命名為:AppModule。

Angular 模塊是一個帶有 @NgModule 裝飾器的類,它接收一個用來描述模塊屬性的元數據對象。

幾個重要的屬性如下:

  • declarations (聲明) - 視圖類屬於這個模塊。 Angular 有三種類型的視圖類: 組件 、 指令 和 管道 。

  • exports - 聲明( declaration )的子集,可用於其它模塊中的組件模板 。

  • imports - 本模塊組件模板中需要由其它導出類的模塊。

  • providers - 服務的創建者。本模塊把它們加入全局的服務表中,讓它們在應用中的任何部分都可被訪問到。

  • bootstrap - 應用的主視圖,稱為根組件,它是所有其它應用視圖的宿主。只有根模塊需要設置 bootstrap 屬性中。

一個最簡單的根模塊:

app/app.module.ts 文件:

import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; @NgModule({ imports: [ BrowserModule ], providers: [ Logger ], declarations: [ AppComponent ], exports: [ AppComponent ], bootstrap: [ AppComponent ] }) export class AppModule { }

接下來我們通過引導根模塊來啟動應用,開發過程通常在 main.ts 文件中來引導 AppModule ,代碼如下:

app/main.ts 文件:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './app.module'; platformBrowserDynamic().bootstrapModule(AppModule);

組件(Components)

組件是一個模板的控製類用於處理應用和邏輯頁面的視圖部分。

組件是構成 Angular 應用的基礎和核心,可用於整個應用程序中。

組件知道如何渲染自己及配置依賴注入。

組件通過一些由屬性和方法組成的 API 與視圖交互。

創建 Angular 組件的方法有三步:

  • 從 @angular/core 中引入 Component 修飾器
  • 建立一個普通的類,併用 @Component 修飾它
  • 在 @Component 中,設置 selector 自定義標籤,以及 template 模板

模板(Templates)

Angular模板的默認語言就是HTML。

我們可以通過使用模板來定義組件的視圖來告訴 Angular 如何顯示組件。以下是一個簡單是實例:

<div>
網站地址 : {{site}}
</div>

在Angular中,默認使用的是雙大括號作為插值語法,大括號中間的值通常是一個組件屬性的變量名。


元數據(Metadata)

元數據告訴 Angular 如何處理一個類。

考慮以下情況我們有一個組件叫作 Component ,它是一個類,直到我們告訴 Angular 這是一個組件為止。

你可以把元數據附加到這個類上來告訴 Angular Component 是一個組件。

在 TypeScript 中,我們用 裝飾器 (decorator) 來附加元數據。

實例

@Component({
   selector : 'mylist',
   template : '<h2>教程</h2>'
   directives : [ComponentDetails]
})
export class ListComponent{...}

@Component 裝飾器能接受一個配置對象,併把緊隨其後的類標記成了組件類。

Angular 會基於這些信息創建和展示組件及其視圖。

@Component 中的配置項說明:

  • selector - 一個 css 選擇器,它告訴 Angular 在 父級 HTML 中尋找一個 <mylist> 標籤,然後創建該組件,併插入此標籤中。

  • templateUrl - 組件 HTML 模板的地址。

  • directives - 一個數組,包含 此 模板需要依賴的組件或指令。

  • providers - 一個數組,包含組件所依賴的服務所需要的依賴注入提供者。


數據綁定(Data binding)

數據綁定為應用程序提供了一種簡單而一致的方法來顯示數據以及數據交互,它是管理應用程序里面數值的一種機製。

通過這種機製,可以從HTML里面取值和賦值,使得數據的讀寫,數據的持久化操作變得更加簡單快捷。

如圖所示,數據綁定的語法有四種形式。每種形式都有一個方向——從 DOM 來、到 DOM 去、雙向,就像圖中的箭頭所示意的。

  • 插值 : 在 HTML 標籤中顯示組件值。

    <h3>
    {{title}}
    <img src="{{ImageUrl}}">
    </h3>
    
  • 屬性綁定: 把元素的屬性設置為組件中屬性的值。

    <img [src]="userImageUrl">
    
  • 事件綁定: 在組件方法名被點擊時觸發。

    <button (click)="onSave()">保存</button>
    
  • 雙向綁: 使用Angular里的NgModel指令可以更便捷的進行雙向綁定。

    <input [value]="currentUser.firstName"
           (input)="currentUser.firstName=$event.target.value" >
    

指令(Directives)

Angular模板是動態的 。當 Angular 渲染它們時,它會根據指令對 DOM 進行修改。

指令是一個帶有"指令元數據"的類。在 TypeScript 中,要通過 @Directive 裝飾器把元數據附加到類上。

在Angular中包含以下三種類型的指令:

  • 屬性指令:以元素的屬性形式來使用的指令。
  • 結構指令:用來改變DOM樹的結構
  • 組件:作為指令的一個重要子類,組件本質上可以看作是一個帶有模板的指令。
<li *ngFor="let site of sites"></li>
<site-detail *ngIf="selectedSite"></site-detail>

*ngFor 告訴 Angular 為 sites 列表中的每個項生成一個 <li> 標籤。

*ngIf 表示只有在選擇的項存在時,才會包含 SiteDetail 組件。


服務(Services)

Angular2中的服務是封裝了某一特定功能,併且可以通過注入的方式供他人使用的獨立模塊。

服務分為很多種,包括:值、函數,以及應用所需的特性。

例如,多個組件中出現了重復代碼時,把重復代碼提取到服務中實現代碼復用。

以下是幾種常見的服務:

  • 日志服務
  • 數據服務
  • 消息總線
  • 稅款計算器
  • 應用程序配置

以下實例是一個日志服務,用於把日志記錄到瀏覽器的控製台:

export class Logger {
  log(msg: any)   { console.log(msg); }
  error(msg: any) { console.error(msg); }
  warn(msg: any)  { console.warn(msg); }
}

依賴注入

控製反轉(Inversion of Control,縮寫為IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫"依賴查找"(Dependency Lookup)。

通過控製反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。

在傳統的開發模式中,調用者負責管理所有對象的依賴,循環依賴一直是夢魘,而在依賴注入模式中,這個管理權交給了注入器(Injector),它在軟件運行時負責依賴對象的替換,而不是在編譯時。這種控製反轉,運行注入的特點即是依賴注入的精華所在。

Angular 能通過查看構造函數的參數類型,來得知組件需要哪些服務。 例如, SiteListComponent 組件的構造函數需要一個 SiteService:

constructor(private service: HeroService) { }

當 Angular 創建組件時,會首先為組件所需的服務找一個注入器( Injector ) 。

注入器是一個維護服務實例的容器,存放著以前創建的實例。

如果容器中還沒有所請求的服務實例,注入器就會創建一個服務實例,併且添加到容器中,然後把這個服務返回給 Angular 。

當所有的服務都被解析完併返回時, Angular 會以這些服務為參數去調用組件的構造函數。 這就是依賴注入 。

北斗有巢氏 有巢氏北斗