이 글은 angular의 콘텐츠 프로젝션을 이해하는 데 도움이 될 것이며, 단일 슬롯 콘텐츠 프로젝션, 멀티 슬롯 콘텐츠 프로젝션 및 조건부 콘텐츠 프로젝션을 소개하는 것이 모든 사람에게 도움이 되기를 바랍니다.
【관련 튜토리얼 추천: "angular tutorial"】
단일 슬롯 콘텐츠 프로젝션
단일 슬롯 콘텐츠 프로젝션은 컴포넌트를 프로젝션할 수 있는 컴포넌트를 생성하는 것을 의미합니다.
zippy-basic.comComponent.ts
import { Component } from '@angular/core'; @Component({ selector: 'app-zippy-basic', template: ` <h2 id="单插槽内容投影">单插槽内容投影</h2> <ng-content></ng-content> ` }) export class ZippyBasicComponent {}
ng-content
요소를 사용하면 이 구성 요소의 사용자는 이제 자신의 메시지를 구성 요소에 투영할 수 있습니다. 예: 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: ` <h2 id="多插槽内容投影">多插槽内容投影</h2> <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> <h3 id="内容">内容:</h3> <ng-container [ngTemplateOutlet]="greet"></ng-container> </main> <footer>底部</footer> <ng-template #greet> <div> <h4 id="hi">hi!</h4> <h4 id="hello-nbsp-my-nbsp-dear-nbsp-friend">hello my dear friend!</h4> </div> </ng-template>
效果:
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组件中的内容 --> <h1 id="PartA-start">PartA--start</h1> <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> <h1 id="PartA-start">PartA--start</h1> <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() {} }효과는 다음과 같습니다.

ng-content 요소는 자리 표시자이며 실제 DOM 요소를 생성하지 않습니다. ng-content
의 사용자 정의 속성은 무시됩니다.
- 구성 요소 템플릿에는 여러
ng-content
태그가 포함되어 있습니다. - 해당
ng-content
태그에 프로젝션할 수 있는 프로젝션된 콘텐츠를 구별하려면ng에서 <code>select
를 사용해야 합니다. -content 태그 >식별 속성. -
select
속성은 태그 이름, 속성, CSS 클래스 및 :not 의사 클래스의 모든 조합을 지원합니다. -
select
속성을 추가하지 않은ng-content
태그가 기본 슬롯으로 사용됩니다. 일치하는 모든 투영된 콘텐츠는 ng-content의 위치에 투영됩니다.

ng-container
태그는 실제 DOM 요소의 렌더링이 필요하지 않으므로 이 태그를 사용하는 것이 좋습니다. 🎜🎜rrreee매개변수 | 유형 | 설명 |
---|---|---|
templateRefExp | TemplateRef | null | 템플릿 참조와 템플릿의 컨텍스트 객체를 정의하는 데 사용되는 문자열 | contextExp | Object | null | 는 로컬 템플릿의 let 문에 키 이름을 바인딩할 수 있는 개체입니다. 컨텍스트 객체에서 $implicit를 키 이름으로 사용하는 경우 기본값으로 사용됩니다. |
ng-template
태그의 #ID
는 templateRefExp
와 일치하며 ng-template
태그의 내용은 지정된 ngTemplateOutlet
에 포함됩니다. 🎜🎜예 1: 🎜rrreee🎜효과: 🎜🎜
-
ContentChild
: 콘텐츠 하위 노드와 관련, 🎜투영된 콘텐츠를 작동🎜; -
ViewChild
: 뷰 하위 노드와 관련하여 🎜자체 뷰 콘텐츠를 운영🎜;
🎜ContentChild🎜
🎜이전 부분에서는 콘텐츠 프로젝션을 사용했습니다. 사용자 정의 구성 요소 태그에 html 태그 또는 사용자 정의 구성 요소 태그를 포함할 수 있도록 하려면 투영된 콘텐츠에서 어떻게 작동합니까? 🎜🎜먼저 두 개의 구성 요소를 생성하세요🎜rrreeerrreee🎜part-b
구성 요소의 콘텐츠를 투영하세요. part-a
컴포넌트에 🎜rrreee🎜🎜컴포넌트의 라이프사이클에는 투사된 콘텐츠의 초기화와 관련된 후크 ngAfterContentInit()
가 있고, 그래서 투영된 콘텐츠가 걱정됩니다. 초기화가 완료된 후 작업을 수행해 보세요🎜🎜🎜ViewChild🎜
🎜이전 부분의ContentChild
작업은 투영된 콘텐츠이고, ViewChild
작동하는 것은 자체 보기 콘텐츠입니다.이전 부분의
content.comComponent.html
를 다음과 같이 수정합니다: 🎜rrreeerrreee🎜🎜ngAfterContentInit()는 <code> ngAfterViewInit()
에 해당합니다(뷰 노드 초기화는 투영된 콘텐츠가 초기화된 후입니다). 🎜🎜🎜ContentChild
및 ViewChild
도 복수형, 즉 ContentChildren
및 ViewChildren
은 노드 컬렉션을 가져오며 다른 노드 간에 차이가 없습니다. 🎜🎜쓰기는 다음과 같습니다. 🎜rrreee🎜For 프로그래밍 관련 지식을 더 보려면 🎜프로그래밍 입문🎜을 방문하세요! ! 🎜위 내용은 Angular의 세 가지 유형의 콘텐츠 프로젝션(단일 슬롯, 다중 슬롯, 조건부)을 이해하는 기사 1개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

JavaScript는 현대 웹 개발의 핵심 언어이며 다양성과 유연성에 널리 사용됩니다. 1) 프론트 엔드 개발 : DOM 운영 및 최신 프레임 워크 (예 : React, Vue.js, Angular)를 통해 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축합니다. 2) 서버 측 개발 : Node.js는 비 차단 I/O 모델을 사용하여 높은 동시성 및 실시간 응용 프로그램을 처리합니다. 3) 모바일 및 데스크탑 애플리케이션 개발 : 크로스 플랫폼 개발은 개발 효율을 향상시키기 위해 반응 및 전자를 통해 실현됩니다.

JavaScript의 최신 트렌드에는 Typescript의 Rise, 현대 프레임 워크 및 라이브러리의 인기 및 WebAssembly의 적용이 포함됩니다. 향후 전망은보다 강력한 유형 시스템, 서버 측 JavaScript 개발, 인공 지능 및 기계 학습의 확장, IoT 및 Edge 컴퓨팅의 잠재력을 포함합니다.

JavaScript는 현대 웹 개발의 초석이며 주요 기능에는 이벤트 중심 프로그래밍, 동적 컨텐츠 생성 및 비동기 프로그래밍이 포함됩니다. 1) 이벤트 중심 프로그래밍을 사용하면 사용자 작업에 따라 웹 페이지가 동적으로 변경 될 수 있습니다. 2) 동적 컨텐츠 생성을 사용하면 조건에 따라 페이지 컨텐츠를 조정할 수 있습니다. 3) 비동기 프로그래밍은 사용자 인터페이스가 차단되지 않도록합니다. JavaScript는 웹 상호 작용, 단일 페이지 응용 프로그램 및 서버 측 개발에 널리 사용되며 사용자 경험 및 크로스 플랫폼 개발의 유연성을 크게 향상시킵니다.

Python은 데이터 과학 및 기계 학습에 더 적합한 반면 JavaScript는 프론트 엔드 및 풀 스택 개발에 더 적합합니다. 1. Python은 간결한 구문 및 풍부한 라이브러리 생태계로 유명하며 데이터 분석 및 웹 개발에 적합합니다. 2. JavaScript는 프론트 엔드 개발의 핵심입니다. Node.js는 서버 측 프로그래밍을 지원하며 풀 스택 개발에 적합합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기
