1. 程式人生 > >【Angular學習】(二)指令

【Angular學習】(二)指令

在 Angular 中有三種類型的指令:

元件 — 擁有模板的指令。
結構型指令 — 通過新增和移除 DOM 元素改變 DOM 佈局的指令。
屬性型指令 — 改變元素、元件或其它指令的外觀和行為的指令。

屬性型指令

屬性型指令至少需要一個帶有 @Directive 裝飾器的控制器類。該裝飾器指定了一個用於標識屬性的選擇器。 控制器類實現了指令需要的指令行為。

建立方式

例如建立一個highlight

結構型指令

NgIf

該指令用於根據表示式的值,動態控制模板內容的顯示與隱藏。
它與 AngularJS 1.x 中的 ng-if 指令的功能是等價的。

語法

<div *ngIf="condition">...</div>

NgFor

該指令用於基於可迭代物件中的每一項建立相應的模板。
它與 AngularJS 1.x 中的 ng-repeat 指令的功能是等價的。

語法

<li *ngFor="let item of items;">...</li>

NgSwitch

Angular 的 NgSwitch 實際上是一組相互合作的指令:NgSwitch、NgSwitchCase 和 NgSwitchDefault。
一個值(hero.emotion)被被賦值給了 NgSwitch,以決定要顯示哪一個分支。

NgSwitch 本身不是結構型指令,而是一個屬性型指令,它控制其它兩個 switch 指令的行為。 這也就是要寫成 [ngSwitch] 而不是 *ngSwitch 的原因。

NgSwitchCase 和 NgSwitchDefault 都是結構型指令,因此要使用星號(*)字首來把它們附著到元素上。
NgSwitchCase 會在它的值匹配上選項值的時候顯示它的宿主元素。
NgSwitchDefault 則會當沒有兄弟。
NgSwitchCase 匹配上時顯示它的宿主元素。

<div [ngSwitch]="hero?.emotion">
  <app-happy-hero    *ngSwitchCase="'happy'"    [hero]="hero"></app-happy-hero>
  <app-sad-hero      *ngSwitchCase="'sad'"      [hero]="hero"></app-sad-hero>
  <app-confused-hero *ngSwitchCase="'app-confused'" [hero]="hero"></app-confused-hero>
  <app-unknown-hero  *ngSwitchDefault           [hero]="hero"></app-unknown-hero>
</div>

寫法

指令同時具有兩種拼寫形式大駝峰和小駝峰,比如NgIf 和 ngIf。 這裡的原因在於,NgIf 引用的是指令的類名,而 ngIf 引用的是指令的屬性名。
指令的類名拼寫成大駝峰形式(NgIf),而它的屬性名則拼寫成小駝峰形式(ngIf)。

星號(*)

指令前加星號,是一個語法糖。
從內部實現來說,Angular 把 *ngIf 屬性 翻譯成一個 <ng-template> 元素 並用它來包裹宿主元素。
比如下面的例子

<div *ngIf="hero" class="name">{{hero.name}}</div>

angular會將它翻譯成

<ng-template [ngIf]="hero">
  <div class="name">{{hero.name}}</div>
</ng-template>