Life Cycle Hooks
Angular provides a set of lifecycle hooks that give you visibility into key moments in the component's lifecycle.
There are several lifecycle hooks in Angular, including:
- ngOnChanges
- ngOnInit
- ngDoCheck
- ngAfterContentInit
- ngAfterContentChecked
- ngAfterViewInit
- ngAfterViewChecked
- ngOnDestroy
OnChanges
It is called when the data-bound properties of a directive/component are changed. It is called before ngOnInit and whenever one or more data-bound input properties change.
<form>
<input [(ngModel)]="message" name="message" />
<button type="submit" (click)="onSubmit()">Submit</button>
</form>
<p>{{ message }}</p>
import {
Component,
Input,
OnChanges,
OnInit,
SimpleChanges,
} from '@angular/core';
@Component({
selector: 'app-test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.css'],
})
export class TestComponent implements OnChanges {
@Input() message: string;
prevMessage: string;
ngOnChanges(changes: SimpleChanges) {
if (changes.message) {
console.log(
`message changed from ${changes.message.previousValue} to ${changes.message.currentValue}`
);
}
}
onSubmit() {
this.prevMessage = this.message;
}
}
<app-test [message]="'Hello World'"></app-test>
OnInit
It is called after Angular has initialized all data-bound properties of a directive/component. It is called only once after the first ngOnChanges.
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
constructor() {}
ngOnInit() {
console.log('logged from ngOnInit');
}
}
DoCheck
It is called during every change detection run, and it is used to detect and act upon changes that Angular doesn't catch on its own.
import { Component, DoCheck } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements DoCheck {
ngDoCheck() {
console.log('ngDoCheck Called');
}
}
AfterViewInit
It is called after Angular has fully initialized a component's view. It is the perfect place to put any initialization logic that depends on the view.
import { AfterViewInit, Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterViewInit{
ngAfterViewInit(){
console.log("after view init")
}
clickMe(){
console.log("link clicked")
}
}
<a (click)="clickMe()">Click me</a>
AfterViewChecked
It is called after Angular has checked the component's view and child views. It is called after ngAfterViewInit and every subsequent ngAfterContentChecked.
import { AfterViewChecked, Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterViewChecked {
ngAfterViewChecked(){
console.log("after view checked")
}
clickMe(){
console.log("link clicked")
}
}
<a (click)="clickMe()">Click me</a>
AfterContentInit
It is called after Angular has fully initialized the content of a directive. It is the perfect place to put any initialization logic that depends on the content.
import { AfterContentInit, Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterContentInit {
ngAfterContentInit() {
console.log('after content init');
}
clickMe() {
console.log('clicked');
}
}
<a (click)="clickMe()">Click me</a>
AfterContentChecked
It is called after the default change detector has completed checking all content of a directive. It is called after ngAfterContentInit and every subsequent ngAfterContentChecked.
import { AfterContentInit, Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterContentInit {
ngAfterContentChecked() {
console.log('after content init');
}
clickMe() {
console.log('clicked');
}
}
<a (click)="clickMe()">Click me</a>
OnDestroy
It is called just before Angular destroys the directive/component. It is used to cleanup any resources or subscriptions that the directive/component has created.
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Subscription } from 'rxjs';
import { of } from 'rxjs';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements OnInit, OnDestroy {
private subscription: Subscription;
ngOnInit() {
const someObservable = of(1, 2, 3);
this.subscription = someObservable.subscribe((data) => {
console.log(data);
});
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}