When a component is rendered, content inside it is ignored, for example:
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: '<div>{{title}}</div>', }) export class AppComponent { title = 'app works!'; }
Using it like:
<app-root>Ignored content</app-root>
Renders:
<div>app works!</div>
But looking at PrimeNg dialog, they use components like this:
<p-dialog [(visible)]="display"> <p-header> Header content here </p-header> Content <p-footer> Footer content here </p-footer> </p-dialog>
As Header content here
, Content
and Footer content here
are inside the component, why are not they getting ignored and how can I achieve this?
Content projection is a pattern in which you insert, or project, the content you want to use inside another component. For example, you could have a Card component that accepts content provided by another component.
The ng-content is used when we want to insert the content dynamically inside the component that helps to increase component reusability. Using ng-content we can pass content inside the component selector and when angular parses that content that appears at the place of ng-content.
Add <ng-content></ng-content>
to the component's template where the content should be projected:
@Component({ selector: 'app-demo', template: '<div>{{title}}</div> <br> <ng-content></ng-content>', }) export class DemoComponent { title = 'Works!'; }
Content to be projected:
<app-demo>This is projected content!</app-demo>
The output will be:
Works! This is projected content!
Here is a great article about Angular Content Projection (Angular 1 Transclusion): Transclusion in Angular 2 with ng-content
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With