Angular的「ng-」元素
來自專欄 輕流QingFlow
Angular擁有很多遵循ng-
命名約定的屬性,它們都共享一個共同的特徵(它們不會被渲染到最終的DOM中),但是在行為和用法上有所不同。
ng-container
我們一般用的最多的那個是ng-container
。Angular 的<ng-container>
是一個分組元素,但它不會污染樣式或元素布局,因為 Angular壓根不會把它放進 DOM中。
<! - usage - > < ng-container > < p >我是一個段落。</ p > </ ng-container > <! - result - > < p >我是一個段落。</ p >
要想知道這可能有用,可以想像你想有條件地包含多個元素而不破壞元素之間的父子關係(例如在列表或表中,或者關係用於CSS樣式規則的地方)或者重複條件一遍又一遍地:
<!-- 沒有ng-container: 無效的標記 --><ul> <li>One</li> <li>Two</li> <div *ngIf="moreThanTwo"> <li>Three</li> <li>Four</li> <li>Five</li> </div></ul><!-- 沒有ng-container: 重複 --><ul> <li>One</li> <li>Two</li> <li *ngIf="moreThanTwo">Three</li> <li *ngIf="moreThanTwo">Four</li> <li *ngIf="moreThanTwo">Five</li></ul><!-- 有ng-container --><ul> <li>One</li> <li>Two</li> <ng-container *ngIf="moreThanTwo"> <li>Three</li> <li>Four</li> <li>Five</li> </ng-container></ul>
ng-content
將HTML注入到指定位置的模板中的能力,這現在被稱為 「內容投影」。在這種情況下,ng-content
元素完全被投影內容所取代。例如,給定一個帶有選擇器的組件my-component
:
<! - template - > < ng-content > </ ng-content > <! - usage - > < my-component > < p >我是一個段落。</ p > </ my-component > <! - result - > < p >我是一個段落。</ p >
該元素還具有一個select
屬性,允許您指定將哪個元素投影到哪裡,特別是當您ng-content
為不同的投影內容使用多個元素時。一個更複雜的例子,使用類作為選擇器:
<! - template - > < ng-content select = 「.first」 > </ ng-content > < ng-content select = 「.second」 > </ ng-content > <! - usage - > < my-component > < p class = 「second」 >我將是最後一個。</ p > < p class = 「first」 >我會第一個。</ p > </ my-component > <! class = 「first」 >我會第一個。</ p > < p class = 「second」 >我將是最後一個。</ p >
有三種選擇器可以使用:
- classes(
select=".class"
); - attributes(
select="[attribute]"
); 和 - 元素(
select="element"
)。
它們可以根據需要進行組合; 使用全部三種:
<! - template - > < ng-content select = 「p.foo [aria-label]」 > </ ng-content > <! - usage - > < my-component > < p class = 「foo 「 >忽略我。</ p > < p class = 「foo」 aria-label = 「Projected」 >項目我。</ p > < p class = 「bar」 aria-label = 「忽略」 > 不理我。</ p ></ my-component > <! - result - > < p class = 「foo」 aria-label = 「Projected」 > 投射我。</ p >
這對編寫你希望父組件具有一定影響力的標記的通用組件有用。但是,請注意,您不能這樣做<ng-content *ngFor="...">
,因為內容僅曾經投影過一次,並且來自父項的投影內容無法引用子項中的變數。
請注意,如果您使用ngTemplateOutlet呈現子內容,則可以傳遞上下文。
<!-- template --><div> <p class="child">{{ childProperty }}</p> <ng-content></ng-content></div><!-- usage --><my-component> <p class="parent">{{ childProperty }}</p> <p class="parent">{{ parentProperty }}</p></my-component><!-- result --><div> <p class="child">I am a property of the child.</p> <p class="parent"></p> <p class="parent">I am a property of the parent.</p></div>
ng-template
<ng-template>是一個 Angular 元素,用來渲染 HTML。 它永遠不會直接顯示出來。 事實上,在渲染視圖之前,Angular 會把 <ng-template>
及其內容替換為一個注釋。
如果沒有使用結構型指令(例如*ngIf和*ngFor),而僅僅把一些別的元素包裝進 <ng-template>
中,那些元素就是不可見的。
<! - bindings = { 「ng-reflect-ng-if」:「true」 } - > <! - bindings = { 「ng-reflect-ng-switch-case」:「true」 } - > <! - bindings = { 「ng-reflect-ng-for-of」:「[object Object],[object Object」 } - >
這些綁定是告訴Angular要呈現什麼以及在什麼情況下的規則。如果沒有達到適當的條件,則根本不包括相關要素。結構指令通過ng-template
兩步分解為元素:
<! - original - > < p * ngIf = 「condition」 >也許顯示我?</ p > <! - step 1 - > < p template = 「ngIf condition」 >也許顯示我嗎?</ p > <! - step 2 - > < ng-template [ ngIf ] =「 condition 」 > < p >也許顯示我?</ p > </ ng-template >
正如你所看到的,這將語法糖變成了一個ng-template
熟悉[...]="..."
屬性綁定的元素。
如果您使用Angular 4.x,的,則需要對ngif上的then和else語法直接使用ng-template,因此默認情況下,替代元素不會出現在呈現的DOM中。以下是根據boolean屬性顯示兩個元素中的一個的四種方法:
<!-- 2.x version with ngSwitch --><div [ngSwitch]="condition"> <p *ngSwitchCase="true">Condition was true.</p> <p *ngSwitchDefault>Condition was false.</p></div><!-- 2.x version with ngIf twice --><div> <p *ngIf="condition">Condition was true.</p> <p *ngIf="!condition">Condition was false.</p></div><!-- 4.x version with ngIf; else --><div *ngIf="condition; else falseCase"> <p>Condition was true.</p></div><ng-template #falseCase> <p>Condition was false.</p></ng-template><!-- 4.x version with ngIf; then; else --><div *ngIf="condition; then trueCase; else falseCase"></div><ng-template #trueCase> <p>Condition was true.</p></ng-template><ng-template #falseCase> <p>Condition was false.</p></ng-template><!-- result (condition=true) --><div> <p>Condition was true.</p></div>
推薦閱讀:
※SpringCloud分享俱樂部
※假如你可以個人主導 C++,你打算怎樣裁剪、擴充和訂製 C++ 來達到你心中最完美的 C++?
※設計模式 1 章-組件協作模式
※大佬,我代碼哪錯了?