DEV Community

Cover image for Angular: Content Projection end to end
Kurapati Mahesh
Kurapati Mahesh

Posted on • Edited on

Angular: Content Projection end to end

Content projection is a pattern in which you insert the content that you want to show inside another component.

<ng-content></ng-content> - responsible to project content inside another component. It is just a placeholder and will be replaced by actual projected content.

There are several ways of doing this in Angular:

  1. Single-slot content projection: other component accepts content from single source
<!--app.component.html-->
<app-child>
<p>project this content</p>
</app-child>

<!--child.component.html-->
<p>Single-slot content projection</p>
<ng-content></ng-content>
Enter fullscreen mode Exit fullscreen mode

output:

Image description

  1. Multi-slot content projection: Component accepts content from multiple sources. Hence, we must specify where to project content. We can accomplish this task by select attribute of <ng-content>
<!--app.component.html-->
<app-child>
<p> First project content </p>
<p select="[foo]"> foo project content </p>
<p select="[bar]"> bar project content </p>
<p> Lastly projected content </p>
</app-child>

<!--child.component.html-->
<h2>Multi-slot content projection</h2>
<ng-content></ng-content>
<ng-content #foo></ng-content>
<ng-content #bar></ng-content>

Enter fullscreen mode Exit fullscreen mode

output:

Image description

Note: An element without a select attribute receives all projected components that do not match any of the other elements.

  • If you observe above the Lastly projected content doesn't have any select but still projected via empty ng-content.
  1. Conditional Content Projection: Achieved using <ng-template> and ngTemplateOutlet directive.
<h2>Conditional Content Projection</h2>

<p>Basic Template outlet Implementation</p>

<ng-template #template1>
  <p>template info</p>
</ng-template>

<p>It prints before templateInfo</p>

<ng-container *ngTemplateOutlet="template1"> </ng-container>
Enter fullscreen mode Exit fullscreen mode

ngTemplateOutlet is a structural directive used to insert ng-template in various sections of DOM.

User can use any element like div. But div won't be rendered

 <div *ngTemplateOutlet="template1"></div>
Enter fullscreen mode Exit fullscreen mode

Output:

Image description

We can also pass value to ngTemplateOutlet using ngTemplateOutletContext property.

<p>Passing value to template outlet</p>

<ng-template let-value="value" #template2>
  <p>Value recieved: {{ value }}</p>
</ng-template>

<ng-container
  [ngTemplateOutlet]="template2"
  [ngTemplateOutletContext]="{ value: 100 }"
>
</ng-container>

<!--Alternatively-->
<ng-container
  *ngTemplateOutlet="template2; context: { value: 100 }"
></ng-container>
Enter fullscreen mode Exit fullscreen mode

We can also send multiple values.

Output:

Image description

You can view the complete output here:

Please let me know if I miss to cover any cases.

You can follow me: https://twitter.com/urstrulyvishwak

Thanks

Top comments (0)