詳解Angular2 之 結(jié)構(gòu)型指令
Angular 有一個(gè)強(qiáng)力的模板引擎,它能讓你輕松維護(hù)元素的DOM樹(shù)結(jié)構(gòu)。
Angular指令可分為三種
- 組件
- 屬性型指令
- 結(jié)構(gòu)型指令
組件
組件其實(shí)就是一個(gè)帶模板的指令。是這三種指令中最常用的,我們會(huì)編寫大量的組件來(lái)構(gòu)建application。
屬性型指令
屬性型指令會(huì)修改元素的外觀或者行為。 e.g. NgStyle可以修改元素的好幾個(gè)樣式。
結(jié)構(gòu)型指令
結(jié)構(gòu)型指令通過(guò)添加和刪除 DOM 元素來(lái)改變DOM的布局。
我們經(jīng)??吹降膬?nèi)置的結(jié)構(gòu)型指令有:ngIf、ngSwitch、ngFor。
下面我們著重介紹ngIf。
NgIf案例分析
該指令接受一個(gè)布爾值,并據(jù)此讓一整塊DOM樹(shù)出現(xiàn)或者消失。
注意:這里是出現(xiàn)或者消失,并不是隱藏。
隱藏元素的利弊
當(dāng)我們隱藏元素時(shí),組件的行為還在繼續(xù)。
它仍然附加子啊它所屬于的DOM元素上,它仍然在監(jiān)聽(tīng)事件。angular會(huì)繼續(xù)檢查哪些能影響數(shù)據(jù)綁定的變更。組件原本要做的哪些事情仍然在進(jìn)行!它還是占用著那么多的資源。
另外一方面,重新顯示這個(gè)組件會(huì)很快。
組件以前的狀態(tài)被保留著,并隨時(shí)可以顯示。組件不用重新初始化,當(dāng)然,該操作付出代價(jià)比較大!
移除元素組件
利
把ngIf設(shè)置為false,將會(huì)影響到組件的資源消耗。angular會(huì)從DOM中移除該元素,停止相關(guān)組件的變更檢測(cè),把它從DOM事件中移除,并且銷毀組件。組件會(huì)被垃圾回收,并釋放內(nèi)存。
弊
如果我們很快再次使用這個(gè)組件的時(shí)候,重建組件的代價(jià)是非常大的。
當(dāng)ngIf重新變成true的時(shí)候,angular會(huì)重新創(chuàng)建該組件及其子樹(shù)。angular會(huì)重新運(yùn)行每個(gè)組件的初始化邏輯。
總結(jié)
基于上面的利弊分析,無(wú)論是我們?cè)谑褂脙?nèi)置的指令還是使用自定的指令的時(shí)候,我們應(yīng)該自己分析提添加、移除元素以及創(chuàng)建和銷毀組件的后果。
標(biāo)簽
在Angular應(yīng)用之外,標(biāo)簽的默認(rèn)CSS屬性display是none。 它的內(nèi)容存在于一個(gè)隱藏的文檔片段中。
而在Angular應(yīng)用中,Angular會(huì)移除 標(biāo)簽及其子元素。
我們可以通過(guò)把短語(yǔ)”Hip! Hip! Hooray!”中間的”hip”包在一個(gè)標(biāo)簽中來(lái)驗(yàn)證下這個(gè)效果。
<p> Hip! </p> <template> <p> Hip! </p> </template> <p> Hooray! </p>
這時(shí)候顯示的內(nèi)容是'Hip! Hooray!',在Angular的控制下,DOM的效果是不同的。
顯然,Angular把標(biāo)簽及其內(nèi)容替換成了一個(gè)空白
自定義指令
我們自頂一個(gè)類似ngIf的指令。
import { Directive, Input } from '@angular/core'; import { TemplateRef, ViewContainerRef } from '@angular/core'; /** 選中器[],是匹配頁(yè)面上的指令,可以有多個(gè)名稱,由于是自己的指令,所以沒(méi)有使用ng開(kāi)頭 */ @Directive({ selector: '[myUnless]' }) export class UnlessDirective { /** * 我們需要訪問(wèn)模板,并且還需要一個(gè)渲染器來(lái)渲染它的內(nèi)容。 * 我們通過(guò)TemplateRef來(lái)訪問(wèn)模板。渲染器是ViewContainerRef。 * 我們把它們都作為私有變量注入到構(gòu)造函數(shù)中。 */ constructor( private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef ) { } /** * 如果條件為假,我們就渲染模板,否則就清空元素內(nèi)容。 * 我們現(xiàn)在先把myUnless屬性定義成一個(gè)“只寫”屬性。 */ @Input() set myUnless(condition: boolean) { if (!condition) { this.viewContainer.createEmbeddedView(this.templateRef); } else { this.viewContainer.clear(); } } }
幾個(gè)概念
星號(hào)(*)效果
這個(gè)星號(hào)是一種“語(yǔ)法糖”。它簡(jiǎn)化了ngIf和ngFor —— 無(wú)論是寫還是讀。
ngIf
接下來(lái)這兩個(gè)ngIf范例的效果完全相同,只是我們寫成了另一種風(fēng)格:
<!-- 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會(huì)把風(fēng)格(A)寫成風(fēng)格(B)。 它把段落及其內(nèi)容移到了 標(biāo)簽中。 它把指令移到了 標(biāo)簽上,成為該標(biāo)簽的一個(gè)屬性綁定 —— 包裝在方括號(hào)中。 宿主組件的condition 屬性的布爾值決定該模板的內(nèi)容是否應(yīng)該被顯示。
ngFor
Angular把*ngFor轉(zhuǎn)換成一個(gè)類似的形式:
<!-- 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>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
AngularJS 入門教程之HTML DOM實(shí)例詳解
本文主要介紹AngularJS HTML DOM,這里幫大家整理了詳細(xì)的資料,并附實(shí)例代碼詳細(xì)講解,有需要的小伙伴可以參考下2016-07-07angular項(xiàng)目中bootstrap-datetimepicker時(shí)間插件的使用示例
這篇文章主要介紹了angular項(xiàng)目中bootstrap-datetimepicker時(shí)間插件的使用示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03angularJS利用ng-repeat遍歷二維數(shù)組的實(shí)例代碼
本篇文章主要介紹了angularJS利用ng-repeat遍歷二維數(shù)組的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06AngularJS 應(yīng)用身份認(rèn)證的技巧總結(jié)
這篇文章主要介紹了AngularJS 應(yīng)用身份認(rèn)證的技巧總結(jié),具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11Angular4學(xué)習(xí)之Angular CLI的安裝與使用教程
網(wǎng)上很多教程過(guò)時(shí),命令在angular4中不適用等等,所以下面這篇文章主要給大家介紹了關(guān)于Angular4學(xué)習(xí)之Angular CLI的安裝與使用教程的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01AngularJS輔助庫(kù)browserTrigger用法示例
這篇文章主要介紹了AngularJS輔助庫(kù)browserTrigger用法,結(jié)合實(shí)例形式分析了輔助庫(kù)browserTrigger的功能及單元測(cè)試中的使用技巧,需要的朋友可以參考下2016-11-11Angular中使用ui router實(shí)現(xiàn)系統(tǒng)權(quán)限控制及開(kāi)發(fā)遇到問(wèn)題
這篇文章主要介紹了Angular中使用ui router實(shí)現(xiàn)系統(tǒng)權(quán)限控制及開(kāi)發(fā)遇到問(wèn)題的相關(guān)資料,本文分步驟介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09