91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

angular中的內容投影有哪幾種

發布時間:2021-10-15 10:58:55 來源:億速云 閱讀:153 作者:iii 欄目:web開發

本篇內容介紹了“angular中的內容投影有哪幾種”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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>

效果如下:
angular中的內容投影有哪幾種

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>

效果如下:
angular中的內容投影有哪幾種

在前面的示例中,只有第二個 ng-content 元素定義了select 屬性。結果,第一個 ng-content 元素就會接收投影到組件中的任何其他內容。

有條件的內容投影

推薦使用ng-container標簽,因為該標簽不需要渲染真實的 DOM 元素。

<ng-container *ngTemplateOutlet="templateRefExp; context: contextExp"></ng-container>
<!-- 等同 -->
<ng-container [ngTemplateOutlet]="templateRefExp" [ngTemplateOutletContext]="contextExp"></ng-container>
參數類型說明
templateRefExpTemplateRef | null一個字符串,用于定義模板引用以及模板的上下文對象
contextExpObject | 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>

效果:

angular中的內容投影有哪幾種

ViewChild和ContentChild

  • ContentChild:與內容子節點有關,操作投影進來的內容;

  • ViewChild:與視圖子節點有關,操作自身的視圖內容;

ContentChild

在上一部分,我們通過內容投影,讓自定義的組件標簽能夠嵌入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()是與投影內容初始化有關,所以我們有關投影的內容操作盡量放在它初始化完成之后進行

ViewChild

上一部分的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()(視圖節點初始化是在投影內容初始化之后)

ContentChildViewChild還存在復數的形式,即ContentChildrenViewChildren,它們取到的是節點的一個集合,其他的沒有什么區別

寫法如下:

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中的內容投影有哪幾種”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

聊城市| 葵青区| 乌拉特后旗| 三河市| 洪洞县| 顺义区| 荆门市| 衡阳市| 綦江县| 孝昌县| 萍乡市| 张家港市| 苍南县| 宁陵县| 樟树市| 内黄县| 宣城市| 应用必备| 绥化市| 娱乐| 潍坊市| 土默特左旗| 根河市| 礼泉县| 鞍山市| 荆州市| 称多县| 寿宁县| 仁怀市| 洛扎县| 南宫市| 无极县| 吴江市| 密山市| 无棣县| 项城市| 罗山县| 高唐县| 滕州市| 崇明县| 兴城市|