Angular gives us 8 hooks to allow us to tap into the lifecycle of our components and trigger actions at specific points in the lifecycle.

This post discusses lifecycle hooks in Angular 2 and up.

Here are the lifecycle hooks available, in the order in which they are invoked:

  • <^>ngOnChanges<^>: Called every time a data-bound input property changes. It's called a first time before the ngOnInit hook. The hook receives a <^>SimpleChanges<^> object that contains the previous and current values for the data-bound inputs properties. This hook gets called often, so it's a good idea to limit the amount of processing it does.
  • <^>ngOnInit<^>: Called once upon initialization of the component.
  • <^>ngDoCheck<^>: Use this hook instead of ngOnChanges for changes that Angular doesn't detect. It gets called at every change detection cycle, so keeping what it does to a minimum is important for performance.
  • <^>ngAfterContentChecked<^>: Called after the projected content is checked.
  • <^>ngAfterViewInit<^>: Called after a component's view or child view is initialized.
  • <^>ngAfterViewChecked<^>: Called after a component's view or child view is checked.
  • <^>ngOnDestroy<^>: Called once when the component is destroyed and a good hook to use to cleanup and unsubscribe from observables.

ngOnInit

lifecycle hooks illustration for: ngOnInit

Let's give you a simple example using the <^>ngOnInit<^> hook. The ngOnInit lifecycle hook is probably the one you'll use most often. If you have a lot of processing to do when the component gets created, it's good practice to do it in the ngOnInit hook rather than in the constructor:

				
					
import { Component, &lt;^&gt;OnInit&lt;^&gt; } from '@angular/core';



@Component({

 selector: 'my-app',

 templateUrl: './app.component.html'

})

export class AppComponent implements &lt;^&gt;OnInit&lt;^&gt; {

 constructor() {}



 &lt;^&gt;ngOnInit()&lt;^&gt; {

 this.setupData();

 this.doStuff();

 // ...

 }



 setupData() {

 // ...

 }



 doStuff() {

 // ...

 }

}

				
			

Notice how we import <^>OnInit<^>, but we implement it with the <^>ngOnInit<^> method. It's the same principle for the other lifecycle hooks.

Multiple Lifecycle hooks

Implementing multiple hooks is just as easy:

				
					
import { Component, &lt;^&gt;OnInit, OnDestroy&lt;^&gt; } from '@angular/core';



@Component({

 selector: 'my-app',

 templateUrl: './app.component.html'

})

export class AppComponent implements &lt;^&gt;OnInit, OnDestroy&lt;^&gt; {

 constructor() {}



 &lt;^&gt;ngOnInit()&lt;^&gt; {

 console.log('Component Init');

 }



 &lt;^&gt;ngOnDestroy()&lt;^&gt; {

 console.log('Component Destroy');

 }

}

				
			

ngOnChanges

The ngOnChanges hook, with it's <^>SimpleChanges<^> object, is a little different. Here's how you would implement it. Let's say we have a component used like this:

				
					
&lt;my-todo [title]="title" [content]="content"&gt;&lt;/my-todo&gt;

				
			

Now say that we want to do something when the <^>title<^> property changes:

				
					
[label Child Component: my-todo.component.ts]

import { Component, Input, SimpleChanges, OnChanges }

 from '@angular/core';



@Component({

 // ...

})

export class MyTodoComponent implements OnChanges {

 @Input() title: string;

 @Input() content: string;

 constructor() { }