這期內(nèi)容當中小編將會給大家?guī)碛嘘PAngular中NgTemplateOutlet指令的理解和用法是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)公司:從2013年創(chuàng)立為各行業(yè)開拓出企業(yè)自己的“網(wǎng)站建設”服務,為上千家公司企業(yè)提供了專業(yè)的做網(wǎng)站、成都網(wǎng)站建設、網(wǎng)頁設計和網(wǎng)站推廣服務, 定制制作由設計師親自精心設計,設計的效果完全按照客戶的要求,并適當?shù)奶岢龊侠淼慕ㄗh,擁有的視覺效果,策劃師分析客戶的同行競爭對手,根據(jù)客戶的實際情況給出合理的網(wǎng)站構(gòu)架,制作客戶同行業(yè)具有領先地位的。
最近在看一個培訓項目的時候有看到這個NgTemplateOutlet
這個結(jié)構(gòu)性指令,但是我之前沒接觸過,不知道這東西是怎么用的,然后,我去官網(wǎng)上去搜了一下這個api(官網(wǎng)鏈接點這里)。
只是說一下NgTemplateOutlet
的用法和使用場景。
這個api按照官網(wǎng)的說法是這樣的:
根據(jù)一個提前備好的
TemplateRef
插入一個內(nèi)嵌視圖。
我給它翻譯一下:使NgTemplateOutlet
的宿主元素變成一個內(nèi)嵌視圖——這個內(nèi)嵌視圖是根據(jù)一個提前定義好的templateRef
模板引用生成的。而宿主元素無論是什么元素,都不會被渲染出來。
我們將官網(wǎng)的示例改一下(因為官網(wǎng)的人命我看不懂):
@Component({ selector: 'ng-template-outlet-example', template: ` <ng-container *ngTemplateOutlet="one"></ng-container> <hr> <ng-container *ngTemplateOutlet="two; context: myContext"></ng-container> <hr> <ng-container *ngTemplateOutlet="three; context: myContext"></ng-container> <hr> <ng-template #one><span>Hello</span></ng-template> <ng-template #two let-name><span>Hello {{name}}!</span></ng-template> <ng-template #three let-person="lastName">My name is <span>LeBron {{person}}!</span></ng-template> ` }) export class NgTemplateOutletExample { myContext = {$implicit: 'World', lastName: 'James'}; }
一個宿主元素可以使用ngTemplateOutlet
這個結(jié)構(gòu)性指令,使自己變成任意的一個<ng-template>
模板生成的內(nèi)嵌視圖。并且可以給其設置上下文對象。然后我們在這個模板中可以使用let-變量
這個模板輸入變量來獲取上下文對象中的值,這個模板更具靈活性。
類似于ng-zorro這個框架的分頁組件Pagination
(官網(wǎng)鏈接)。如果我們對默認上一頁和下一頁的樣式或者結(jié)構(gòu)不滿意,想要自己調(diào)整的話,我們可以提供一個輸入屬性(@Input定義的屬性),來接收一個模板,并且為其提供所必須的屬性或者方法。這樣的話,我們就可以在不修改組件源碼的情況下實現(xiàn)組件的復用。
我們先定義一個子組件HeroDisplayCard
,角色的展示界面
@Component({ selector:'app-hero-display-card', template:` <h3 [style]="{textAlign:'center'}">角色列表</h3> <ul class="hero-card-box"> <li class="hero-card-item" *ngFor="let h of heroesList"> <p [style]="{textAlign:'center'}"> 角色id:{{h.id}}-- 角色名字:{{h.name}}-- 角色屬性:{{h.features}} </p> </li> </ul> `, styles:[ `.hero-card-box{ width: 600px; margin: 10px auto; } .hero-card-item{ list-style: none; } ` ] }) export class HeroDisplayCard { public heroesList = [ {id:'013',name:'鐘離',features:'rock'}, {id:'061',name:'煙緋',features:'fire'}, {id:'022',name:'迪奧娜',features:'ice'}, {id:'004',name:'諾艾爾',features:'rock'}, ] }
然后將這個組件引入一個父組件當中:
@Component({ selector:'app-templateoutlet-app-demo', template:` <app-hero-display-card></app-hero-display-card> ` }) export class TemplateOutletAppDemoComponent {}
代碼運行一下,效果如圖:
我覺得這個li
的樣式實在是太丑了,而且順序也不太對。我希望把角色屬性調(diào)到角色名字之前。這樣的話,如果只是單純的通過輸入屬性來更改樣式的話就會變得很麻煩,我們可能需要定義非常多的變量來供使用者選擇,這樣的話有點得不償失。那么我們何不直接提供一個模板給使用者,我們只需要提供必要的數(shù)據(jù)就可以了。樣式,排版這些自由交給使用者。
那么對于子組件HeroDisplayCard
我們可以這么改:
@Component({ selector:'app-hero-display-card', template:` <h3 [style]="{textAlign:'center'}">角色列表</h3> <ul class="hero-card-box"> <ng-container *ngFor="let h of heroesList"> <!-- 如果沒有傳入cardItemTemplate則顯示默認 --> <li class="hero-card-item" *ngIf="!cardItemTemplate"> <p [style]="{textAlign:'center'}"> 角色id:{{h.id}}-- 角色名字:{{h.name}}-- 角色屬性:{{h.features}} </p> </li> <!-- 如果傳入了自定義模板,則顯示出來,鑒于angular的結(jié)構(gòu)型指令不能在同一個宿主元素上的規(guī)定,于是這樣寫 --> <ng-container *ngIf="cardItemTemplate"> <!-- 將自定義模板的上下文對象設置為h --> <ng-container *ngTemplateOutlet="cardItemTemplate;context:h"></ng-container> </ng-container> </ng-container> </ul> `, styles:[ //省略 ] }) export class HeroDisplayCard { @Input() cardItemTemplate:TemplateRef<any>; public heroesList = [ // 省略] }
然后我們在父組件中將自定義的模板傳入進去:
@Component({ selector:'app-templateoutlet-app-demo', template:` <app-hero-display-card [cardItemTemplate]="myCardTemplate"></app-hero-display-card> <!-- 將模板引用變量myCardTemplate傳入子組件 --> <ng-template #myCardTemplate let-id="id" let-name="name" let-features="features"> <li class="hero-card-custom-item"> <p>角色id:<span>{{id}}</span></p> <p>角色屬性:<span>{{features}}</span></p> <p>角色名字:<span>{{name}}</span></p> </li> </ng-template> `, styles:[ //在這里寫自定義模板的樣式 `.hero-card-custom-item{ width: 100%; height: 35px; border: 1px solid #999999; border-radius: 5px; display: flex; justify-content:space-around; align-items: center; margin: 10px 0; } .hero-card-custom-item p { width: 30%; margin: 0; font-size: 20px; color: #666666; } .hero-card-custom-item p span { color: red; }` ] }) export class TemplateOutletAppDemoComponent {}
然后運行一下,效果如圖(其實還是很丑):
使用NgTemplateOutlet
這個結(jié)構(gòu)性指令可以增強我們子組件的封裝程度,避免需要定義大量的輸入屬性,導致父組件的模板看起來臃腫不堪。
上述就是小編為大家分享的Angular中NgTemplateOutlet指令的理解和用法是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站名稱:Angular中NgTemplateOutlet指令的理解和用法是什么
分享地址:http://www.chinadenli.net/article8/peijip.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供建站公司、外貿(mào)網(wǎng)站建設、外貿(mào)建站、全網(wǎng)營銷推廣、靜態(tài)網(wǎng)站、網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)