您好,登錄后才能下訂單哦!
本篇內容介紹了“angular中的內容投影有哪幾種”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
單插槽內容投影是指創建一個組件,你可以在其中投影一個組件。
zippy-basic.component.ts
import { Component } from '@angular/core'; @Component({ selector: 'app-zippy-basic', template: ` <h3>單插槽內容投影</h3> <ng-content></ng-content> ` }) export class ZippyBasicComponent {}
有了 ng-content
元素,該組件的用戶現在可以將自己的消息投影到該組件中。例如:
app.component.html
<!-- 將 app-zippy-basic 元素包裹的全部內容投影到 zippy-basic 組件中去 --> <app-zippy-basic> <p>單插槽內容投影:投影數據</p> </app-zippy-basic>
效果如下:
ng-content 元素是一個占位符,它不會創建真正的 DOM 元素。
ng-content
的那些自定義屬性將被忽略。
組件模板含有多個
ng-content
標簽。為了區分投影的內容可以投影到對應
ng-content
標簽,需要使用ng-content
標簽上的select
屬性作為識別。
select
屬性支持標簽名、屬性、CSS 類和 :not 偽類的任意組合。不添加
select
屬性的ng-content
標簽將作為默認插槽。所有為匹配的投影內容都會投影在該ng-content的位置。
zippy-multislot.component.ts
import { Component } from '@angular/core'; @Component({ selector: 'app-zippy-multislot', template: ` <h3>多插槽內容投影</h3> <ng-content></ng-content> <ng-content select="[question]"></ng-content> ` }) export class ZippyMultislotComponent {}
app.component.html
<!-- 使用 question 屬性的內容將投影到帶有 `select=[question]` 屬性的 ng-content 元素。 --> <app-zippy-multislot> <p question style="color: hotpink;"> 帶question屬性的p元素 </p> <p style="color: lightgreen">不帶question屬性的p元素-->匹配到不帶select屬性的ng-content</p> <p>不帶question屬性的p元素-->匹配到不帶select屬性的ng-content</p> </app-zippy-multislot>
效果如下:
在前面的示例中,只有第二個 ng-content 元素定義了select 屬性。結果,第一個 ng-content 元素就會接收投影到組件中的任何其他內容。
推薦使用
ng-container
標簽,因為該標簽不需要渲染真實的 DOM 元素。
<ng-container *ngTemplateOutlet="templateRefExp; context: contextExp"></ng-container> <!-- 等同 --> <ng-container [ngTemplateOutlet]="templateRefExp" [ngTemplateOutletContext]="contextExp"></ng-container>
參數 | 類型 | 說明 |
---|---|---|
templateRefExp | TemplateRef | null | 一個字符串,用于定義模板引用以及模板的上下文對象 |
contextExp | Object | null | 是一個對象,該對象的鍵名將可以在局部模板中使用 let 聲明中進行綁定。在上下文對象中使用 $implicit 為鍵名時,將把它作為默認值。 |
ng-template
標簽的#ID
會匹配templateRefExp
,將ng-template
標簽的內容嵌入到指定的ngTemplateOutlet
中。
例一:
<header>頭部</header> <main> <h4>內容:</h4> <ng-container [ngTemplateOutlet]="greet"></ng-container> </main> <footer>底部</footer> <ng-template #greet> <div> <h5>hi!</h5> <h5>hello my dear friend!</h5> </div> </ng-template>
效果:
ContentChild
:與內容子節點有關,操作投影進來的內容;
ViewChild
:與視圖子節點有關,操作自身的視圖內容;
在上一部分,我們通過內容投影,讓自定義的組件標簽能夠嵌入html標簽或自定義組件標簽,那么它如何操作投影進來的內容呢?
首先創建兩個組件
/**** part-b.component.ts ****/ import { Component, OnInit,Output} from '@angular/core'; @Component({ selector: 'app-content-part-b', templateUrl: './part-b.component.html', styleUrls: ['./part-b.component.scss'] }) export class PartBComponent implements OnInit { constructor() { } ngOnInit() { } public func():void{ console.log("PartB"); } }
/**** part-a.component.ts ****/ import { Component, OnInit, ContentChild } from '@angular/core'; // 1、引入 part-b 組件 import { PartBComponent } from '../part-b/part-b.component'; @Component({ selector: 'app-content-part-a', templateUrl: './part-a.component.html', styleUrls: ['./part-a.component.scss'] }) export class PartAComponent implements OnInit { // 2、獲取投影 @ContentChild(PartBComponent) PartB:PartBComponent constructor() { } ngOnInit() {} ngAfterContentInit(): void { // 3、調用 part-b 組件的 func() 方法 this.PartB.func(); } public func() { console.log('PartA') } }
將part-b
組件的內容投影到part-a
組件中
<!-- content.component.html --> <div> <div>Content</div> <div> <app-content-part-a> <!-- 投影在part-a組件中的內容 --> <h2>PartA--start</h2> <app-content-part-b></app-content-part-b> <span>PartA--end</span> </app-content-part-a> </div> </div>
在組件的生命周期里面,有一個鉤子
ngAfterContentInit()
是與投影內容初始化有關,所以我們有關投影的內容操作盡量放在它初始化完成之后進行
上一部分的ContentChild
操作的時投影進來的內容,而ViewChild
操作的是自身的視圖內容
給上一部分的content.component.html
修改如下:
<!-- content.component.html --> <div> <div>Content</div> <div> <!-- 在此處引用模板變量 #partA --> <app-content-part-a #partA> <h2>PartA--start</h2> <app-content-part-b></app-content-part-b> <span>PartA--end</span> </app-content-part-a> </div> </div>
/**** content.component.ts ****/ import { Component, OnInit, ViewChild } from '@angular/core'; @Component({ selector: 'app-content', templateUrl: './content.component.html', styleUrls: ['./content.component.scss'] }) export class ContentComponent implements OnInit { // 2、獲取視圖 partA @ViewChild('partA') partA: any; constructor() { } ngOnInit() {} ngAfterViewInit(): void { // 3、調用 part-a 組件的 func() 方法 this.partA.func(); } }
ngAfterContentInit()
對應的是ngAfterViewInit()
(視圖節點初始化是在投影內容初始化之后)
ContentChild
和ViewChild
還存在復數的形式,即ContentChildren
和ViewChildren
,它們取到的是節點的一個集合,其他的沒有什么區別
寫法如下:
import { Component, OnInit, ContentChild,ContentChildren ,QueryList } from '@angular/core'; import { PartBComponent } from '../part-b/part-b.component'; @Component({ selector: 'app-content-part-a', templateUrl: './part-a.component.html', styleUrls: ['./part-a.component.scss'] }) export class PartAComponent implements OnInit { @ContentChildren(PartBComponent) PartBs: QueryList<PartBComponent>; constructor() { } ngOnInit() {} }
“angular中的內容投影有哪幾種”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。