Angular-第2課-組件的使用

Vincent Zheng
新手工程師的程式教室
8 min readNov 17, 2018

在第1課,我們自動產生了App Component這個組件。這一課要試著建立另一個新組件,放置在App Component當中。此外也會編輯它們,在瀏覽器查看修改後的成果。

課程關鍵字:#組件 #Metadata #插值綁定 #物件類別

一、版面與程式的關係

首先開啟/src/app/app.component.html
在上方的<h1>標籤內,有個「Welcome to {{ title }}!」文字,那就是應用程式啟動時所看到的標題文字。

不過「title」的值從哪裡來呢?請開啟/src/app/app.component.ts
在裡面會看到一個「AppComponent」類別,裡面定義了一個變數title,就是在這裡,而它的值目前是應用程式的名稱。

回到html檔,使用兩個大括號,裡面夾一個變數,是Angular的「插值綁定」語法。這種做法能夠將ts檔(程式檔)中的變數插入到html檔中。

現在試著將title的值改為「Tour of Heroes」並儲存,此時Angular CLI自動重新建置專案,瀏覽器也跟著刷新,我們看到了修正後的標題。

接著開啟/src/app/app.component.css
這個檔案會提供風格樣式給html,但目前是空白的,因此我們將官方文件的範例CSS直接貼進來。

/* Application-wide Styles */
h1 {
color: #369;
font-family: Arial, Helvetica, sans-serif;
font-size: 250%;
}
h2, h3 {
color: #444;
font-family: Arial, Helvetica, sans-serif;
font-weight: lighter;
}
body {
margin: 2em;
}
body, input[text], button {
color: #888;
font-family: Cambria, Georgia;
}
/* everywhere else */
* {
font-family: Arial, Helvetica, sans-serif;
}

儲存後,瀏覽器畫面也隨之刷新,變得好看一點了。

修改後的歡迎畫面

做個小結論,對於同一組件,可以在html中使用「插值綁定」語法,將ts中對應的變數給插入進來。而css提供樣式給html,使其更加美觀。

二、新增組件

這一節我們要新建一個組件。首先在終端機切換到專案資料夾的根目錄,也就是src資料夾的上一層。執行下面的命令,新建名為「heroes」的組件。

ng new component 組件名稱ng new component heroes

此時產生了新目錄:/src/app/heroes。這是新組件的檔案存放的地方。一樣有html、css與ts三種檔案。再回顧一下,AppComponent組件是整個應用程式的容器,裡面容納了子組件。而這樣的檔案放置方式也說明了這點。

請開啟這個組件的程式檔:/src/app/heroes/heroes.component.ts

自動產生的ts檔內容

第1行從Angular的核心函式庫匯入了Component這個標記(annotation)和OnInit這個介面。

HeroesComponent類別上面標記了@Component,用來表示這個類別是一個組件。以Spring來比喻,標記@Service就代表那個類別是個業務邏輯層。而在@Component中還定義了一些資料(metadata):

  1. selector:在父組件(如AppComponent)的html檔放置本組件時,所要使用的html標籤名稱。下面的小節會再解說。
  2. templateUrl:這個組件的html檔位置。如同Android的setContentView方法定義了layout檔所在地。
  3. styleUrls:這個組件的專屬css檔位置。

這個類別實作了ngOnInit介面。「OnInit」是Angular的生命週期,就像Android的onCreate一樣。ngOnInit是組件在執行期間實體化後所執行,通常會把初始化的作業撰寫在這裡。

三、放置組件

這一節我們要將HeroesComponent這個組件,放置到AppComponent中。但在這之前,先修改一下組件的版面和程式。

首先開啟heroes.component.ts,在類別中加入一個變數:

hero = 'Windstorm';

接著開啟heroes.component.html,將當前的版面配置清空。並使用上一節介紹的「插值綁定」語法,將程式檔(ts檔)的變數給插入進來。

{{hero}}

經過對組件的編輯,此時HeroesComponent就像AppComponent一樣,已經是做好,能被使用的組件了。只是它還沒放置,因此在網頁上不會顯示。

接下來將HeroesComponent放置好。請開啟app.component.html,將內容改為如下:

<h1>{{title}}</h1>
<app-heroes></app-heroes>

第1行的title就是在第一節所修改的標題文字。而第2行的<app-heroes>則是在第二節,@Component中所定義的selector。selector的值代表這個組件現在被放置在別的html時,所要使用的標籤名稱。

儲存後畫面刷新,AppComponent只剩下標題,而HeroesComponent確實被放置進來。它們上頭都顯示著在html檔中透過插值綁定而來的文字。

加入新組件後的樣子

四、物件類別

現今流行的網頁語言都是物件導向,Angular也不例外。這一節我們要使用「物件」的觀念來改寫HeroesComponent組件。

有物件必定會有類別,首先在/src/app中建立「hero.ts」。這是一個程式檔,用來描述hero這個類別,它會有id和name兩種屬性。與Java不同的是,Type Script的資料型態寫在變數名稱後面。

export class Hero {
id: number;
name: string;
}

回到heroes.component.ts,先前hero這個變數是被賦予一個字串,現在我們改為賦予一個Hero物件。

hero: Hero = {
id: 1,
name: 'Windstorm'
};

雖然直接將程式碼貼上去了,但由於沒有匯入這個類別,因此這個程式不會正常運作,這時可以在上方手動撰寫匯入:

import { Hero } from 'src/app/hero';

若有使用VS Code開發工具,可以點擊右邊的小燈泡,選擇匯入hero類別。

點擊小燈泡匯入類別

匯入後,程式檔已經準備完畢。接下來開啟heroes.component.html,原本hero變數透過插值綁定,插入的是字串,但現在變成插入物件,它是不能直接被顯示的。因此修改html,透過取出物件中的屬性來做顯示。

<h2>{{hero.name | uppercase}} Details</h2>
<div><span>id: </span>{{hero.id}}</div>
<div><span>name: </span>{{hero.name}}</div>

每組大括號都是插入程式檔中的hero物件,並顯示它的屬性。其中第1行的「| uppercase」是將字串轉為英文大寫的「管道操作(pipe operation)」,能用來進行格式化。儲存後即可正常顯示。

在html檔中插入ts檔的物件屬性值

做個小結論,這一節我們在組件的程式檔中運用了新的Hero類別。接著在html檔中,將插入的hero物件的屬性值取出來顯示。

--

--

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

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