Angular-第5課-組件的模組化

Vincent Zheng
新手工程師的程式教室
4 min readNov 19, 2018

在上一課,我們讓一個組件負責顯示清單和顯示詳情這兩件事。在大型專案中,這種做法會使人不容易維護。本課沒有要開發新的功能,而是要拆解上述的組件,讓每個組件只做特定的工作,達到模組化的目標。

課程關鍵字:#模組化 #屬性綁定

一、準備新的html檔

本課要將「顯示詳情」這個工作拆解出來,讓另一個專屬的組件來負責。因此請建立新的組件,名稱為:hero-detail。

ng generate component hero-detail//The new command requires to be run outside of a project, but a project definition was found at "angular.json".

一樣會產生組件的資料夾,裡面有html檔、css檔和ts檔。

現在我們將前面製作的heroes.component.html,下方用來顯示詳情的語法,貼到新產生的hero-detail.component.html中。並且把「selectedHero」改成「hero」,最後內容會變成這樣子:

<div *ngIf="hero"><h2>{{hero.name | uppercase}} Details</h2>
<div><span>id: </span>{{hero.id}}</div>
<div>
<label>name:
<input [(ngModel)]="hero.name" placeholder="name"/>
</label>
</div>
</div>

將selectedHero改為hero是一種維護的手法。在目前的專案,插值進來的物件確實是「被點選的hero」沒錯。但若這個組件以後會在其他地方被重複使用呢?在每個場合都以selectedHero來稱呼就顯得奇怪了!所以才會取名為hero這種比較通用的名字。

二、準備新的ts檔

在ts檔中,需要有變數能插值到html檔。請在hero-detail.component.ts宣告Hero物件,名稱為hero。並且在前面加上一個新的標記:@Input。
此標記需要被匯入進來,在VS Code開發工具可以點旁邊的小燈泡來匯入。

@Input() hero: Hero;

上面的@Input標記,能夠讓外部的組件「輸入」資料進來。有了資料,便能透過插值綁定,插入在負責顯示詳情的html檔中。

三、放置新的組件

這一節要將剛剛完成的hero-detail組件放置在heroes組件中,這樣heroes組件就能將顯示詳情的工作「交付」給hero-detail組件負責。

開啟heroes.component.html,在最下方,也就是原先顯示詳情的位置,將新的組件放置好。

<app-hero-detail [hero]="selectedHero"></app-hero-detail>

這裡複習一下,hero-detail.component.ts檔中的@Component標記裡,selector屬性定義了組件在別的html檔被放置時,所要使用的標籤名稱。

標籤中多了一個「[hero]=”selectedHero”」,這是Angular的「屬性綁定」語法。意思是,將被放置組件的hero變數,綁定到目前組件的selectedHero變數上。這同時也需要ts檔中的@Input標記配合,才能接收資料。

本課heroes組件最後的html檔

整個資料流動的過程是這樣的:清單項目被點擊,使得selectedHero被賦予值。同時由於「屬性綁定」的效果,selectedHero的值會輸入到目標組件ts檔的hero變數。再透過插值綁定,hero-detail的html檔即可顯示資料。

四、拆解組件的好處

將heroes.component.html用來顯示詳情的部分拆解出去,能使這個組件變得簡潔一些。這就和撰寫如Java之類的其他程式,會將篇幅大的程式碼適當地切成小方法是一樣的。講正式一點就是「模組化」。

另外,每個組件都有它獨特的功能,因此可以重複使用。如果其他地方也需要顯示hero詳情的功能,只要仿照本課的作法,在html檔放置該組件,並設定好屬性綁定即可。

--

--

Vincent Zheng
新手工程師的程式教室

我是Vincent,是個來自資管系的後端軟體工程師。當初因為學校作業,才踏出寫部落格的第一步。這裡提供程式教學文章,包含自學和工作上用到的經驗,希望能讓讀者學到東西。我的部落已搬家至 https://chikuwa-tech-study.blogspot.com/