What is the difference between ngAfterContentInit() and ngAfterViewInit()?
The following picture shows the order of the hooks. source: Angular Lifecycle Hooks
ngAfterContentInit
: This is called after components external content has been initialized.
ngAfterViewInit
: This is called after the component view and its child views has been initialized.
Content is what is passed as children usually to be projected at some <ng-content>
element of a component.
View is the template of the current component.
The view is initialized after the content and ngAfterViewInit()
is therefore called after ngAfterContentInit()
.
@Component({
selector: 'parent-cmp',
template: '<div #wrapper><ng-content></ng-content></div>'
})
class ParentComponent {
@ViewChild('wrapper') wrapper:ElementRef;
@ContentChild('myContent') content:ElementRef;
ngAfterViewInit() {
console.log('ngAfterViewInit - wrapper', this.wrapper);
console.log('ngAfterViewInit - content', this.content);
}
ngAfterContentInit() {
console.log('ngAfterContentInit - wrapper', this.wrapper);
console.log('ngAfterContentInit - content', this.content);
}
}
<parent-cmp><div #myContent>foo</div></parent-cmp>
If you run this code, the output for ngAfterViewInit - content
should be null
.
More details about lifecycle hooks see https://angular.io/guide/lifecycle-hooks