목차
1. 콘텐츠 투영을 위한 ng-content
二、 有条件的内容投影
웹 프론트엔드 JS 튜토리얼 각도로 콘텐츠를 프로젝션하는 방법에 대해 이야기해 보겠습니다.

각도로 콘텐츠를 프로젝션하는 방법에 대해 이야기해 보겠습니다.

May 12, 2022 am 10:41 AM
angular angular.js

이 글은 angular에서의 콘텐츠 투영에 대해 이야기하고, 콘텐츠 투영을 위해 ng-content를 사용하는 방법을 소개하며, 조건부 콘텐츠 투영의 구현 방법을 이해하는 것이 모든 사람에게 도움이 되기를 바랍니다.

각도로 콘텐츠를 프로젝션하는 방법에 대해 이야기해 보겠습니다.

1. 콘텐츠 투영을 위한 ng-content

ng-content 进行内容投影

1.1 <span style="font-size: 16px;">ng-content</span>

ng-content 元素是一个用来插入外部或者动态内容的占位符。父组件将外部内容传递给子组件,当 Angular 解析模板时,就会在子组件模板中 ng-content 出现的地方插入外部内容。【相关教程推荐:《angular教程》】

我们可以使用内容投影来创建可重用的组件。这些组件有相似的逻辑和布局,并且可以在许多地方使用。一般我们在封装一些公共组件的时候经常会用到。

1.2 为什么使用内容投影

定义一个 button 组件:

button-component.ts

@Component({
    selector: &#39;[appButton]&#39;,
    template: `
    <span class="icon-search"></span>
`
})
export class AppButtonComponent {}
로그인 후 복사

这个 button 组件的目的是在按钮内部加一个搜索的图标,我们实际使用如下:

<button appButton>click</button>
로그인 후 복사
로그인 후 복사

我们发现组件只会展示搜索图标, 按钮的文本不会展示,能你会想到最常使用的 @Input 装饰器,但是如果我们不只是想传文本进来,而是传一段 html 进来呢?此时就会用到 ng-content

1.3 单插槽内容投影

内容投影的最基本形式是单插槽内容投影

单插槽内容投影是指创建一个组件,我们可以在其中投影一个组件。

以 button 组件为例,创建一个单槽内容投影:

button-component.ts

@Component({
    selector: &#39;[appButton]&#39;,
    template: `
    <span class="icon-search"></span> <ng-content></ng-content>
`
})
export class AppButtonComponent {}
로그인 후 복사

实际使用如下:

<button appButton>click</button>
로그인 후 복사
로그인 후 복사

可以发现,现在这个 button 组件的效果是即显示了搜索图标,又显示了按钮的文本(click)。即把 <button appButton></button> 中间的内容 投影 到了组件的 <ng-content></ng-content> 位置。

ng-content 元素是一个占位符,它不会创建真正的 DOM 元素。ng-content 的那些自定义属性将被忽略。

1.4 多插槽内容投影

一个组件可以具有多个插槽,每个插槽可以指定一个 CSS 选择器,该选择器会决定将哪些内容放入该插槽。该模式称为多插槽内容投影。使用此模式,我们必须指定希望投影内容出现在的位置。可以通过使用 ng-contentselect 属性来完成此任务。

  • 组件模板含有多个 ng-content 标签。
  • 为了区分投影的内容可以投影到对应 ng-content 标签,需要使用 ng-content 标签上的 select 属性作为识别。
  • select 属性支持标签名属性CSS 类 :not 伪类的任意组合。
  • 不添加 select 属性的 ng-content 标签将作为默认插槽。所有未匹配的投影内容都会投影在该 ng-content 的位置。

以 button 组件为例,创建一个多槽内容投影:

button-component.ts

@Component({
    selector: &#39;[appButton]&#39;,
    template: `
    <span class="icon-search"></span> <ng-content select="[shuxing]"></ng-content> <ng-content select="p"></ng-content> <ng-content select=".lei"></ng-content>
`
})
export class AppButtonComponent {}
로그인 후 복사

实际使用如下:

<button appButton>
<p>click</p> <span shuxing>me</span> <span class="lei">here</span>
</button>
로그인 후 복사

1.5 <span style="font-size: 16px;">ngProjectAs</span>

在某些情况下,我们需要使用 ng-container 把一些内容包裹起来传递到组件中。大多数情况是因为我们需要使用结构型指令像 ngIf 或者 ngSwitch 等。。

在下面的例子中,我们将 header 包裹在了 ng-container 中。

@Component({
    selector: &#39;app-card&#39;,
    template: `
		<div class="card">
		  <div class="header">
		    <ng-content select="header"></ng-content>
		  </div>
		  <div class="content">
		    <ng-content select="content"></ng-content>
		  </div>
		  <div class="footer">
		    <ng-content select="footer"></ng-content>
		  </div>
		  <ng-content></ng-content>
		</div>
`
})
export class AppCardComponent {}
로그인 후 복사

使用:

<app-card>
  <ng-container>
    <header>
      <h1>Angular</h1>
    </header>
  </ng-container>
  <content>One framework. Mobile & desktop.</content>
  <footer><b>Super-powered by Google </b></footer>
</app-card>
로그인 후 복사

由于 ng-container 的存在,header 部分并没有被渲染到我们想要渲染的插槽中,而是渲染到了没有提供任何 selectorng-content 中。
在这种情况下,我们可以使用 ngProjectAs 属性。
在上面的 ng-container

1.1 < code><span style="font-size: 16px;">ng-content</span>🎜🎜ng-content 요소는 외부 또는 < 동적 콘텐츠를 위한 code>자리 표시자입니다. 상위 구성 요소는 외부 콘텐츠를 하위 구성 요소에 전달합니다. Angular가 템플릿을 구문 분석하면 ng-content가 있는 하위 구성 요소 템플릿에 나타납니다. 외부 콘텐츠를 삽입합니다. [관련 튜토리얼 추천: "🎜angular tutorial🎜"]🎜🎜콘텐츠 프로젝션을 사용하여 재사용 가능한 구성 요소를 만들 수 있습니다. 이러한 구성 요소는 비슷한 논리와 레이아웃을 가지며 여러 곳에서 사용될 수 있습니다. 일반적으로 일부 공개 구성요소를 캡슐화할 때 이를 자주 사용합니다. 🎜🎜🎜1.2 콘텐츠 프로젝션을 사용하는 이유🎜🎜버튼 구성 요소 정의: 🎜🎜button-comComponent.ts 🎜
<app-card>
  <ng-container ngProjectAs=&#39;header&#39;>
    <header>
      <h1>Angular</h1>
    </header>
  </ng-container>
  <content>One framework. Mobile & desktop.</content>
  <footer><b>Super-powered by Google </b></footer>
</app-card>
로그인 후 복사
로그인 후 복사
🎜 이 버튼 컴포넌트의 목적은 버튼 내부에 검색 아이콘을 추가하는 것입니다. 실제로는 다음과 같이 사용합니다. 🎜
<div>
  <ng-container>
    <p>My name is wyl.</p>
    <p>What is you name?</p>
  </ng-container>
</div>
로그인 후 복사
로그인 후 복사
🎜컴포넌트에는 검색 아이콘만 표시되고 버튼의 텍스트는 표시되지 않습니다. 가장 일반적으로 사용되는 @Input 데코레이터가 생각나겠지만, 텍스트만 전달하는 것이 아니라 html의 일부를 전달하고 싶다면 어떻게 해야 할까요? 이때 ng-content가 사용됩니다. 🎜🎜🎜1.3 단일 슬롯 콘텐츠 투영🎜🎜콘텐츠 투영의 가장 기본적인 형태는 단일 슬롯 콘텐츠 투영입니다. 코드>. 🎜
🎜단일 슬롯 콘텐츠 프로젝션은 구성 요소를 프로젝션할 수 있는 구성 요소를 만드는 것을 의미합니다. 🎜
🎜단일 슬롯 콘텐츠 프로젝션을 생성하려면 버튼 구성 요소를 예로 들어보세요. 🎜🎜button-comComponent.ts🎜
<div>
  <p>My name is wyl.</p>
  <p>What is you name?</p>
</div>
로그인 후 복사
로그인 후 복사
🎜실제 사용법은 다음과 같습니다. 🎜
<ul>
  <ng-container *ngFor="let item of items">
    <li>{{ item .name}}</li>
    <li>{{ item .age}}</li>
    <li>{{ item .sex}}</li>
  </ng-container>
</ul>
로그인 후 복사
로그인 후 복사
🎜You 이제 버튼 구성 요소를 찾을 수 있습니다. 검색 아이콘과 버튼 텍스트(클릭)가 모두 표시되는 효과가 있습니다. 즉, <button appButton></button> 중간에 있는 콘텐츠가 구성 요소의 <ng-content></에 <code>투영됩니다. ng-content>< /code> 위치. 🎜
🎜ng-content 요소는 자리 표시자이며 실제 DOM 요소를 생성하지 않습니다. ng-content의 해당 사용자 정의 속성은 무시됩니다. 🎜
🎜🎜1.4 다중 슬롯 콘텐츠 투영🎜🎜구성 요소는 여러 슬롯을 가질 수 있습니다. 각 슬롯은 해당 슬롯에 들어갈 콘텐츠를 결정하는 CSS 선택기를 지정할 수 있습니다. 이 모드를 멀티 슬롯 콘텐츠 프로젝션이라고 합니다. 이 모드를 사용하면 투영된 콘텐츠를 표시할 위치를 지정해야 합니다. 이는 ng-contentselect 속성을 ​​사용하여 수행할 수 있습니다. 🎜
  • 구성 요소 템플릿에는 여러 ng-content 태그가 포함되어 있습니다.
  • 해당 ng-content 태그에 프로젝션할 수 있는 프로젝션된 콘텐츠를 구별하려면 ng에서 <code>select</code를 사용해야 합니다. -content tag > 식별자로서의 속성.
  • select 속성은 태그 이름, 속성, CSS 클래스를 지원합니다. : 의사 클래스가 아닌 조합.
  • ng-content 태그는 select 속성을 ​​추가하지 않으면 기본 슬롯으로 사용됩니다. 일치하지 않는 모든 프로젝션 콘텐츠는 해당 ng-content 위치에 프로젝션됩니다.
🎜멀티 슬롯 콘텐츠 프로젝션을 생성하려면 버튼 구성 요소를 예로 들어보세요. 🎜🎜button-comComponent.ts🎜
<ng-template>
    <p> In template, no attributes. </p>
</ng-template>

<ng-container>
    <p> In ng-container, no attributes. </p>
</ng-container>
로그인 후 복사
로그인 후 복사
🎜실제 사용법은 다음과 같습니다. 🎜
In ng-container, no attributes.
로그인 후 복사
로그인 후 복사
🎜🎜1.5 <span style="font-size: 16px;">ngProjectAs</span> 🎜🎜어떤 경우에는 ng-container를 사용하여 일부 콘텐츠를 래핑하고 구성 요소에 전달해야 합니다. 대부분의 경우 ngIf 또는 ngSwitch 등과 같은 구조적 지시문을 사용해야 하기 때문입니다. . 🎜🎜아래 예에서는 ng-containerheader를 래핑합니다. 🎜
<ng-template [ngIf]="true">
   <p> ngIf with a ng-template.</p>
</ng-template>

<ng-container *ngIf="true">
   <p> ngIf with an ng-container.</p>
</ng-container>
로그인 후 복사
로그인 후 복사
🎜사용: 🎜
ngIf with a ng-template.
ngIf with an ng-container.
로그인 후 복사
로그인 후 복사
🎜 ng-container의 존재로 인해 header 부분은 렌더링하려는 슬롯에 렌더링되지 않고 no로 렌더링됩니다. ng-contentselector를 제공하세요.
이 경우 ngProjectAs 속성을 ​​사용할 수 있습니다.
위의 ng-container에 이 속성을 추가하면 예상대로 렌더링됩니다. 🎜
<app-card>
  <ng-container ngProjectAs=&#39;header&#39;>
    <header>
      <h1>Angular</h1>
    </header>
  </ng-container>
  <content>One framework. Mobile & desktop.</content>
  <footer><b>Super-powered by Google </b></footer>
</app-card>
로그인 후 복사
로그인 후 복사

二、 有条件的内容投影

如果你的元件需要有条件地渲染内容或多次渲染内容,则应配置该元件以接受一个 ng-template 元素,其中包含要有条件渲染的内容。

在这种情况下,不建议使用 ng-content 元素,因为只要元件的使用者提供了内容,即使该元件从未定义 ng-content 元素或该 ng-content 元素位于 ngIf 语句的内部,该内容也总会被初始化。

使用 ng-template 元素,你可以让元件根据你想要的任何条件显式渲染内容,并可以进行多次渲染。在显式渲染 ng-template 元素之前,Angular 不会初始化该元素的内容。

2.1 <span style="font-size: 16px;">ng-container</span>

既不是一个组件,也不是一个指令,仅仅是一个特殊的tag而已。 使用 ng-container 渲染所包含的模板内容,不包含自身。

  • angular代码片段
<div>
  <ng-container>
    <p>My name is wyl.</p>
    <p>What is you name?</p>
  </ng-container>
</div>
로그인 후 복사
로그인 후 복사
  • 浏览器调试窗口,可以发现 <ng-container> 标签消失了,并没有起任何作用
<div>
  <p>My name is wyl.</p>
  <p>What is you name?</p>
</div>
로그인 후 복사
로그인 후 복사
  • 使用场景,如下,在我们需要遍历if 判断 时,它可以承担一个载体的作用
<ul>
  <ng-container *ngFor="let item of items">
    <li>{{ item .name}}</li>
    <li>{{ item .age}}</li>
    <li>{{ item .sex}}</li>
  </ng-container>
</ul>
로그인 후 복사
로그인 후 복사

另外,ng 中常见错误之一的 forif 不能写在同一标签上(在一个宿主元素上只能应用一个结构型指令),利用 ng-container 标签可以在实现功能的基础上减少层级的嵌套。

2.2 <span style="font-size: 16px;">ng-template</span>

先来看下面一段代码

<ng-template>
    <p> In template, no attributes. </p>
</ng-template>

<ng-container>
    <p> In ng-container, no attributes. </p>
</ng-container>
로그인 후 복사
로그인 후 복사

浏览器输出结果是:

In ng-container, no attributes.
로그인 후 복사
로그인 후 복사

<ng-template> 中的内容不会显示。当在上面的模板中添加 ngIf 指令:

<ng-template [ngIf]="true">
   <p> ngIf with a ng-template.</p>
</ng-template>

<ng-container *ngIf="true">
   <p> ngIf with an ng-container.</p>
</ng-container>
로그인 후 복사
로그인 후 복사

浏览器输出结果是:

ngIf with a ng-template.
ngIf with an ng-container.
로그인 후 복사
로그인 후 복사

2.3 <span style="font-size: 16px;">ng-template</span><ng-container> 的配合使用

<ng-container *ngIf="showSearchBread; else tplSearchEmpty">
     暂时搜索不到您要的数据喔
</ng-container>
<ng-template #tplSearchEmpty>
     快快开始获取吧!
</ng-template>
로그인 후 복사

2.4 <span style="font-size: 16px;">ngTemplateOutlet</span>

插入 ng-template 创建的内嵌视图。 ngTemplateOutlet 是一个结构型指令,接收一个 TemplateRef 类型的值;

<div *ngTemplateOutlet="tpl1"></div>
<ng-template #tpl1>
  <span>I am span in template {{title}}</span>
</ng-template>
로그인 후 복사

*ngTemplateOutlet = "templateRefExp; content: contentExp "

  • templateRefExp: ng-template 元素的 #ID
  • contextExp:
    • 可空参数

    • content 是一个对象,这个对象可以包含一个 $implicitkey 作为默认值, 使用时在 模板 中用 let-key 语句进行绑定

    • content 的非默认字段需要使用 let-templateKey=contentKey 语句进行绑定

使用如下:

@Component({
  selector: &#39;ng-template-outlet-example&#39;,
  template: `
    <ng-container *ngTemplateOutlet="greet"></ng-container>
    <hr>
    <ng-container *ngTemplateOutlet="eng; context: myContext"></ng-container>
    <hr>
    <ng-container *ngTemplateOutlet="svk; context: myContext"></ng-container>
    <hr>
    <ng-template #greet><span>Hello</span></ng-template>
    <ng-template #eng let-name><span>Hello {{name}}!</span></ng-template>
    <ng-template #svk let-person="localSk"><span>Ahoj {{person}}!</span></ng-template>
`
})
class NgTemplateOutletExample {
  myContext = {$implicit: &#39;World&#39;, localSk: &#39;Svet&#39;};
}
로그인 후 복사

2.5 利用 <span style="font-size: 16px;">ngTemplateOutlet</span> 进行内容投影

@Component({
    selector: &#39;app-card&#39;,
    template: `
		<div class="card">
		  <div class="header">
		  	<ng-container *ngTemplateOutlet="headerTemplate; context: { $implicit: title, index: otherDate }"></ng-container>
		  </div>
		</div>
`
})
export class AppCardComponent {

	@ContentChild(&#39;header&#39;, { static: true }) headerTemplate: TemplateRef<any>;

	public title = &#39;Test&#39;;
	public otherDate = {
	 	auth: &#39;me&#39;,
	 	name: &#39;appCard&#39;
	};
}
로그인 후 복사

使用

<app-card>
  <ng-template #header let-label let-item="otherDate">
    <h1>Angular</h1> {{label}} (Test) and  {{otherDate | json}} ({auth: &#39;me&#39;, name: &#39;appCard&#39;})
  </ng-template>
</app-card>
로그인 후 복사

更多编程相关知识,请访问:编程教学!!

위 내용은 각도로 콘텐츠를 프로젝션하는 방법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

독립형 구성 요소에 대한 각도 학습 설명(Standalone Component) 독립형 구성 요소에 대한 각도 학습 설명(Standalone Component) Dec 19, 2022 pm 07:24 PM

이 글은 여러분이 계속해서 Angular를 배우고 Angular의 독립형 컴포넌트(Standalone Component)를 간략하게 이해하는 데 도움이 되기를 바랍니다.

Ubuntu 24.04에 Angular를 설치하는 방법 Ubuntu 24.04에 Angular를 설치하는 방법 Mar 23, 2024 pm 12:20 PM

Angular.js는 동적 애플리케이션을 만들기 위해 자유롭게 액세스할 수 있는 JavaScript 플랫폼입니다. HTML 구문을 템플릿 언어로 확장하여 애플리케이션의 다양한 측면을 빠르고 명확하게 표현할 수 있습니다. Angular.js는 코드를 작성, 업데이트 및 테스트하는 데 도움이 되는 다양한 도구를 제공합니다. 또한 라우팅 및 양식 관리와 같은 많은 기능을 제공합니다. 이 가이드에서는 Ubuntu24에 Angular를 설치하는 방법에 대해 설명합니다. 먼저 Node.js를 설치해야 합니다. Node.js는 서버 측에서 JavaScript 코드를 실행할 수 있게 해주는 ChromeV8 엔진 기반의 JavaScript 실행 환경입니다. Ub에 있으려면

각도 학습 상태 관리자 NgRx에 대한 자세한 설명 각도 학습 상태 관리자 NgRx에 대한 자세한 설명 May 25, 2022 am 11:01 AM

이 글은 Angular의 상태 관리자 NgRx에 대한 심층적인 이해를 제공하고 NgRx 사용 방법을 소개하는 글이 될 것입니다.

Angular의 서버 측 렌더링(SSR)을 탐색하는 기사 Angular의 서버 측 렌더링(SSR)을 탐색하는 기사 Dec 27, 2022 pm 07:24 PM

앵귤러 유니버셜(Angular Universal)을 아시나요? 웹사이트가 더 나은 SEO 지원을 제공하는 데 도움이 될 수 있습니다!

각도에서 monaco-editor를 사용하는 방법에 대한 간략한 분석 각도에서 monaco-editor를 사용하는 방법에 대한 간략한 분석 Oct 17, 2022 pm 08:04 PM

각도에서 모나코 편집기를 사용하는 방법은 무엇입니까? 다음 글은 최근 비즈니스에서 사용되는 Monaco-Editor의 활용 사례를 기록한 글입니다.

Angular + NG-ZORRO로 백엔드 시스템을 빠르게 개발 Angular + NG-ZORRO로 백엔드 시스템을 빠르게 개발 Apr 21, 2022 am 10:45 AM

이 기사는 Angular의 실제 경험을 공유하고 ng-zorro와 결합된 angualr을 사용하여 백엔드 시스템을 빠르게 개발하는 방법을 배우게 될 것입니다. 모든 사람에게 도움이 되기를 바랍니다.

프론트엔드 개발에 PHP와 Angular를 사용하는 방법 프론트엔드 개발에 PHP와 Angular를 사용하는 방법 May 11, 2023 pm 04:04 PM

인터넷의 급속한 발전과 함께 프론트엔드 개발 기술도 지속적으로 개선되고 반복되고 있습니다. PHP와 Angular는 프런트엔드 개발에 널리 사용되는 두 가지 기술입니다. PHP는 양식 처리, 동적 페이지 생성, 액세스 권한 관리와 같은 작업을 처리할 수 있는 서버측 스크립팅 언어입니다. Angular는 단일 페이지 애플리케이션을 개발하고 구성 요소화된 웹 애플리케이션을 구축하는 데 사용할 수 있는 JavaScript 프레임워크입니다. 이 기사에서는 프론트엔드 개발에 PHP와 Angular를 사용하는 방법과 이들을 결합하는 방법을 소개합니다.

Angular의 독립 구성요소에 대한 간략한 분석 및 사용 방법 알아보기 Angular의 독립 구성요소에 대한 간략한 분석 및 사용 방법 알아보기 Jun 23, 2022 pm 03:49 PM

이 기사에서는 Angular의 독립 구성 요소, Angular에서 독립 구성 요소를 만드는 방법, 기존 모듈을 독립 구성 요소로 가져오는 방법을 안내합니다.

See all articles