여러 ng 콘텐츠


95

ng-contentAngular 6에서 다중 을 사용하여 사용자 지정 구성 요소를 만들려고하는데 이것이 작동하지 않으며 이유를 모르겠습니다.

이것은 내 구성 요소 코드입니다.

<div class="header-css-class">
    <ng-content select="#header"></ng-content>
</div>
<div class="body-css-class">
    <ng-content select="#body"></ng-content>
</div>

이 구성 요소를 다른 장소에서 사용하고 다음과 같이 두 개의 다른 HTML 코드를 내부 body및 헤더 select에 렌더링하려고합니다 ng-content.

<div #header>This should be rendered in header selection of ng-content</div>
<div #body>This should be rendered in body selection of ng-content</div>

그러나 구성 요소가 공백으로 렌더링됩니다.

내가 뭘 잘못하고 있는지 또는 동일한 구성 요소에서 두 개의 다른 섹션을 렌더링하는 가장 좋은 방법이 무엇인지 알고 있습니까?

감사!


죄송합니다. stackoverflow가 두 번째 코드 스 니펫을 저장하지 않았습니다. 컴포넌트에서 사용중인 코드는 다음과 같습니다. <div #header> 헤더 콘텐츠입니다. </ div> <div #body> 본문 콘텐츠입니다. </ div>
Lucas Santos

답변:


179
  1. 템플릿 참조 headerbody는 반대로 더미 속성을 추가 할 수 있습니다 (#header, #body).
  2. 그리고 사용 transclude ng-contentselect같은 속성 select="[header]".

app.comp.html

<app-child>
    <div header >This should be rendered in header selection of ng-content</div>
    <div body >This should be rendered in body selection of ng-content</div>
</app-child>

child.comp.html

<div class="header-css-class">
    <ng-content select="[header]"></ng-content>
</div>
<div class="body-css-class">
    <ng-content select="[body]"></ng-content>
</div>

데모


6
당신은 추가 DIV 또는 <NG-용기>를 사용한다 다른 태그 렌더링하지 않으려면
sobczi

3
@AmitChigadani 나는 @sobczi <div header><ng-container header>.
user12893298320392

3
나는 대체 확인 <div header>으로 <ng-container header>도 작동합니다.
azerafati

49

웹 구성 요소 사양에 맞 춥니 다 . 그것이 Angular라도. Angular 지시문과 같은 선택기 속성이나 다른 용도로 예약 된 속성을 피하는 것입니다. 따라서 "slot"속성 만 사용합니다. 우리는 볼 수 있습니다 <ng-content select="[slot=foobar]"><slot name="foobar">.

예:

hello-world.component.html

<ng-content select="[slot=start]"></ng-content>
<span>Hello World</span>
<ng-content select="[slot=end]"></ng-content>

app.component.html

<app-hello-world>
  <span slot="start">This is a </span>
  <span slot="end"> example.</span>
</app-hello-world>

결과

This is a Hello World example.

Stackblitz 예

"banana"또는 "fish"와 같이 원하는 이름을 사용할 수 있습니다. 그러나 "시작"과 "끝"은 요소를 앞뒤에 배치하는 좋은 규칙입니다.


이러한 요소를 어떻게 쿼리 할 수 ​​있습니까? 이름 슬롯 포함.
Nexeuz

Angular 및 구성 요소 설정과 정확히 원하는 것에 따라 다릅니다. 당신은 TS 또는에서 ViewChild를 사용 :host하고 ::ng-deepSCSS에. 그러나 이것은 단지 예일뿐입니다. Stackblitz Maybe ::slotted/ ::contentwill도 작동합니다. 하지만 확실하지 않습니다. 웹은이 주제에 대해 더 많은 것을 제공 할 것입니다. 일반적으로 구성 요소 자체에만 스타일을 지정해야합니다. 그리고 외부 (전역) 스타일링을 피하십시오. 그렇지 않으면 원치 않는 부작용이 발생합니다.
Dominik

포장하는 것이 좋습니다. 마지막 댓글에서 업데이트 된 Stackblitz 예제를 참조하십시오. 구성 요소의 html 및 css 파일을 참조하십시오. ng-deep보다 이것을 선호해야합니다. 예 : <div class="end"><ng-content></ng-content></div>이 요소는 구성 요소에서 액세스 할 수 있기 때문입니다. ng-content는 외부에 도킹 된 요소로 대체되는 가상 요소 일뿐입니다. 따라서 ng-deep 선택기를 사용해야합니다.
Dominik

9

또는 다음을 사용할 수 있습니다.

app.comp.html

<app-child>
    <div role="header">This should be rendered in header selection of ng-content</div>
    <div role="body">This should be rendered in body selection of ng-content</div>
</app-child>

child.comp.html

<div class="header-css-class">
    <ng-content select="div[role=header]"></ng-content>
</div>
<div class="body-css-class">
    <ng-content select="div[role=body]"></ng-content>
</div>

4

다른 답변 보완 :

사용자 정의 태그 (예 <ion-card>: <ion-card-header>,, <ion-card-content>) 로도 수행 할 수 있습니다 .

app.comp.html

<app-child>
    <app-child-header>This should be rendered in header selection of ng-content</app-child-header>
    <app-child-content>This should be rendered in content selection of ng-content</app-child-content>
</app-child>

child.comp.html

<div class="header-css-class">
    <ng-content select="app-child-header"></ng-content>
</div>
<div class="content-css-class">
    <ng-content select="app-child-content"></ng-content>
</div>

경고 메시지가 표시되지만 작동합니다. 당신은 경고 메시지를 표시하거나 할 수 알려진 태그를 사용하는headerfooter. 그러나 이러한 방법이 마음에 들지 않으면 다른 솔루션 중 하나를 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.