詳解Angular2 之 結構型指令
Angular 有一個強力的模板引擎,它能讓你輕松維護元素的DOM樹結構。
Angular指令可分為三種
- 組件
- 屬性型指令
- 結構型指令
組件
組件其實就是一個帶模板的指令。是這三種指令中最常用的,我們會編寫大量的組件來構建application。
屬性型指令
屬性型指令會修改元素的外觀或者行為。 e.g. NgStyle可以修改元素的好幾個樣式。
結構型指令
結構型指令通過添加和刪除 DOM 元素來改變DOM的布局。
我們經(jīng)??吹降膬?nèi)置的結構型指令有:ngIf、ngSwitch、ngFor。
下面我們著重介紹ngIf。
NgIf案例分析
該指令接受一個布爾值,并據(jù)此讓一整塊DOM樹出現(xiàn)或者消失。
注意:這里是出現(xiàn)或者消失,并不是隱藏。
隱藏元素的利弊
當我們隱藏元素時,組件的行為還在繼續(xù)。
它仍然附加子啊它所屬于的DOM元素上,它仍然在監(jiān)聽事件。angular會繼續(xù)檢查哪些能影響數(shù)據(jù)綁定的變更。組件原本要做的哪些事情仍然在進行!它還是占用著那么多的資源。
另外一方面,重新顯示這個組件會很快。
組件以前的狀態(tài)被保留著,并隨時可以顯示。組件不用重新初始化,當然,該操作付出代價比較大!
移除元素組件
利
把ngIf設置為false,將會影響到組件的資源消耗。angular會從DOM中移除該元素,停止相關組件的變更檢測,把它從DOM事件中移除,并且銷毀組件。組件會被垃圾回收,并釋放內(nèi)存。
弊
如果我們很快再次使用這個組件的時候,重建組件的代價是非常大的。
當ngIf重新變成true的時候,angular會重新創(chuàng)建該組件及其子樹。angular會重新運行每個組件的初始化邏輯。
總結
基于上面的利弊分析,無論是我們在使用內(nèi)置的指令還是使用自定的指令的時候,我們應該自己分析提添加、移除元素以及創(chuàng)建和銷毀組件的后果。
標簽
在Angular應用之外,標簽的默認CSS屬性display是none。 它的內(nèi)容存在于一個隱藏的文檔片段中。
而在Angular應用中,Angular會移除 標簽及其子元素。
我們可以通過把短語”Hip! Hip! Hooray!”中間的”hip”包在一個標簽中來驗證下這個效果。
<p> Hip! </p> <template> <p> Hip! </p> </template> <p> Hooray! </p>
這時候顯示的內(nèi)容是'Hip! Hooray!',在Angular的控制下,DOM的效果是不同的。

顯然,Angular把標簽及其內(nèi)容替換成了一個空白
自定義指令
我們自頂一個類似ngIf的指令。
import { Directive, Input } from '@angular/core';
import { TemplateRef, ViewContainerRef } from '@angular/core';
/** 選中器[],是匹配頁面上的指令,可以有多個名稱,由于是自己的指令,所以沒有使用ng開頭 */
@Directive({ selector: '[myUnless]' })
export class UnlessDirective {
/**
* 我們需要訪問模板,并且還需要一個渲染器來渲染它的內(nèi)容。
* 我們通過TemplateRef來訪問模板。渲染器是ViewContainerRef。
* 我們把它們都作為私有變量注入到構造函數(shù)中。
*/
constructor(
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef
) { }
/**
* 如果條件為假,我們就渲染模板,否則就清空元素內(nèi)容。
* 我們現(xiàn)在先把myUnless屬性定義成一個“只寫”屬性。
*/
@Input() set myUnless(condition: boolean) {
if (!condition) {
this.viewContainer.createEmbeddedView(this.templateRef);
} else {
this.viewContainer.clear();
}
}
}
幾個概念
星號(*)效果
這個星號是一種“語法糖”。它簡化了ngIf和ngFor —— 無論是寫還是讀。
ngIf
接下來這兩個ngIf范例的效果完全相同,只是我們寫成了另一種風格:
<!-- Examples (A) and (B) are the same --> <!-- (A) *ngIf paragraph --> <p *ngIf="condition"> Our heroes are true! </p> <!-- (B) [ngIf] with template --> <template [ngIf]="condition"> <p> Our heroes are true! </p> </template>
要知道,Angular會把風格(A)寫成風格(B)。 它把段落及其內(nèi)容移到了 標簽中。 它把指令移到了 標簽上,成為該標簽的一個屬性綁定 —— 包裝在方括號中。 宿主組件的condition 屬性的布爾值決定該模板的內(nèi)容是否應該被顯示。
ngFor
Angular把*ngFor轉換成一個類似的形式:
<!-- Examples (A) and (B) are the same -->
<!-- (A) *ngFor div -->
<div *ngFor="let hero of heroes">{{ hero }}</div>
<!-- (B) ngFor with template -->
<template ngFor let-hero [ngForOf]="heroes">
<div>{{ hero }}</div>
</template>
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
分享使用AngularJS創(chuàng)建應用的5個框架
如果你計劃使用AngularJS創(chuàng)建你的Web應用,那現(xiàn)在就開始吧。你不需要有任何的恐懼和擔心,因為現(xiàn)在有很多的框架都可以很好地支持AngularJS2015-12-12
用AngularJS來實現(xiàn)監(jiān)察表單按鈕的禁用效果
本篇文章主要介紹了用AngularJS來實現(xiàn)監(jiān)察表單按鈕的禁用效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-11-11
AngularJS中$http服務常用的應用及參數(shù)
大家都知道,AngularJS中的$http有很多參數(shù)和調用方法,所以本文只記錄了比較常用的應用及參數(shù),方便大家以后使用的時候參考學習,下面一起來看看吧。2016-08-08

