ng-content example | Angular
my-button.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'my-button',
template: `
<button class='action-btn' (click)="action()">
<ng-content></ng-content>
</button>
`
})
export class MyButtonComponent implements OnInit {
constructor() { }
ngOnInit() {
}
action(){
console.log("action triggered")
}
}
app.component.html
<my-button>
Label 1
</my-button>
<my-button>
Label 2
</my-button>
<ng-content> allows you to add dynamic content inside a custom component.
Using <ng-content>, we can create the same <my-button> with different labels.
<ng-content> helps us achieve translcusion in Angular.
ng-content example | multiple projections
contact.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'contact',
styleUrls: ['./contact.component.css'],
template: `
<div class='contact'>
<ng-content select="h1"></ng-content>
<ng-content select=".phone"></ng-content>
<ng-content></ng-content>
</div>
`
})
export class ContactComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
app.component.html
<contact>
<h1>John</h1>
<span class="phone">555-433-3322</span>
<p>John is a coworker.</p>
</contact>
<contact>
<h1>Jim</h1>
<span class="phone">555-334-1123</span>
<p>Jim is a friend.</p>
</contact>
Using the select attribute, you can specify <ng-content> based on different selectors.
In this example, we specify an <ng-content> for h1 tags and another for elements with the phone class.
Also notice how we include a third <ng-content> without a select attribute. This functions as a "catch all" for any other content we include within our custom <contact> component that does not match the selectors.
ng-content example | styling projected content
contact.component.css
:host ::ng-deep .phone {
color:red;
}
If you want to style the projected content within <ng-content>, you can do so using :host and ::ng-deep to apply styling to all nested elements within the <contact> component.