前言
接下來要介紹三種不同的 Angular 指令,而這裡的指令就是之前一直提到的 Directives 。 Angular 指令有元件型、屬性型、結構型這三種指令,接下來會一一介紹當中差異。
三種 Angular 指令 ( Directives )
- 元件型指令
- 預設的元件就是一個含有樣板的指令
- 屬性型指令
- 這種指令會修改元素的外觀或行為
- 如 ngStyle 、 ngClass 指令可以自由的調整樣式
- 結構型指令
- 這種指令會透過新增或者刪除 DOM 元素改變 DOM 結構
- 例如 ngIf 、 ngFor 、 ngSwitch 就可以控制 DOM 結構
- 特別注意 ngSwitch 前面不要加上星號
- ngIf 、 ngFor 、 ngSwitchDefault 、 ngSwitchCase 前面要加上 * 號
元件型指令
之前建立的 HeaderComponent 就是屬於元件型指令,它是 Component 同時也是 Directives 。
接下來再次新建一個 Component 練習吧,輸入 ng g c footer
,這次我們建立 FooterComponent 。
- 同先前建立 HeaderComponent 步驟,在此不贅述,把程式碼搬運到對應檔案即可
最後別忘了在 AppComponent 內輸入 FooterComponent 的元件型指令,也就是
1 | <app-footer></app-footer> |
接著測試看看是否正常運行
觀察 footer.component.ts
觀察 FooterComponent 的 class
,可以發現只要這是一個 Conponent ,那麼就一定會有一個 裝飾器 ( decorater ) 宣告在上方,如:
FooterComponent
1 | import { Component, OnInit } from '@angular/core'; |
裝飾器 ( decorater )
- 裝飾器的語法為
@
開頭,後面接一個 decorater 的名稱。- 所有的 Conponent 都會有一個名為 Conponent 的 decorater
- 然後傳入一個物件,這個物件用來描述 Conponent 有哪些特性,如
selector
選取器templateUrl
- 指出 template 路徑在哪裡,如果不輸入路徑也可以使用template
屬性,直接輸入該 template 內容即可styleUrl
- 與templateUrl
不同,後面接的是一個陣列的型態,意思也就是可以輸入多個不同的 CSS 檔
template 的例子,如果不想把 template 獨立成一個檔案,可以這麼寫
可以發現這麼做之後,網頁的 footer 仍然是正常的。
不過還是建議獨立成一個檔案比較好,畢竟這樣子實在是不容易閱讀。
事實上裝飾器內可以使用的屬性還有非常多,用到時再查文件就可以了。
styleUrl 的例子,來寫一點 CSS
這個檔案是由 Angular CLI 自動幫我們產生的,因此預設是空白的,讓我們隨意寫一點樣式吧。
- 把 footer 底下的 copyright 字樣改成黃色
1
2
3
4
5
6
7<p class="text-muted credit">
Copyright © 2016 by <a href="https://www.facebook.com/will.fans" target="_blank">XCVGYU</a>
@ <a href="http://www.miniasp.com/" target="_blank">XCVGYUXCVGYU</a> -
Powered by <a href="http://dotnetblogengine.net/" target="_blank">BlogEngine.NET</a> 3.2.0.3 -
Design by <a href="http://seyfolahi.net/" target="_blank"
title="Farzin Seyfolahi - UI/UX Designer at BlogEngine.NET">FS</a>
</p>
調整 credit
,這邊為了方便示範所以直接使用 !important
強制覆蓋。
1 | .credit{ |
接著執行開發伺服器查看效果:
元件內的 CSS 不會影響到其他元件?
之前有提到,在這裡設定的 CSS 只會套用到該元件,不會影響到其他元件,超出 FooterComponent 範圍外的通通不會吃到這裡設定的 CSS 樣式。
這可以透過開發者工具觀察 Angular 是如何辦到的!
Angular 在這些動態產生的 diretive 下所有的標籤全都被加上了一個底線開頭的 attribute 屬性,而且有一定的規律可循。
像是根元件上的 _nghost-tij-c0
, 0 是個編號,只要遇到不重複的 Component 就會有一個唯一的、不重複的編號。
.credit 類別被動態注入到頁面上時,它的選取器並不是單純的 .credit ,而是 .credit 後面加上中括號包覆 attribute 的選取器。
而這個 attribute 剛才說過是個唯一的值,這也是為什麼寫在元件內的 CSS 不會影響到其他元件的原因。
讓元件內的 CSS 會影響到其他元件
可以在裝飾器內新增一個屬性 encapsulation
,要把這部分的封裝調整成 none
,具體設定如下:
1 | @Component({ |
- 預設是
Emulated
,也就是模擬的意思,就是指 CSS Style 的封裝,- 在此要把它改成
none
,意思是不需要進行 CSS Style 的封裝。
- 在此要把它改成
如此一來,這個 .credit 就會渲染到整個網頁了。
設定後,現在當 .credit 類別被動態注入到頁面上時,它的選取器已經是單純的 .credit 了,也就是說這個網頁所有用到 .credit 這個 class 都會吃到字體顏色變成黃色的設定。
以上就是元件型指令在使用上可能會用到的一些設定與注意事項,接下來要介紹的是屬性型指令。