I came to the point that I did not know when to use the constructor or ngOnInit. I had this Observable not giving me data until I reached the NgOnInit function. 

A colleague advised me to use NgOnInit, then I looked up some theory. Let me sum up here.

The Constructor always exists and is executed when the class is instantiated and ensures proper initialization of fields in the class and its subclasses.

Angular, analyses the constructor parameters and when it creates a new instance by calling new MyClass() it tries to find providers that match the types of the constructor parameters, resolves them, and passes them to the constructor like

new MyClass(someArg);

ngOnInit is a life cycle hook called by Angular to indicate that Angular is done creating the component.

We have to import OnInit like this in order to use it (actually implementing OnInit is not mandatory but considered good practice):

import { Component, OnInit } from '@angular/core';

then to make use of the method OnInit, we have to implement the class like this:

export class App implements OnInit {
  constructor() {
     // Called first time before the ngOnInit()

  ngOnInit() {
     // Called after the constructor and called  after the first ngOnChanges() 

Implement this interface to execute custom initialization logic after your directive's data-bound properties have been initialized. ngOnInit is called right after the directive's data-bound properties have been checked for the first time, and before any of its children have been checked. It is invoked only once when the directive is instantiated.

Mostly we use ngOnInit for all the initialization/declaration and avoid stuff to work in the constructor. The constructor should only be used to initialize class members but shouldn't do actual "work".

So you should use constructor() to set up Dependency Injection and not much else. ngOnInit() is better place to "start" - it's where/when components' bindings are resolved.


So, with the above in our minds, we probably will almost always use the ngOnInit because this is comes after our data is loaded and before our children are loaded. 

For more information refer here:


Saved you some valuable time?

Buy me a drink 🍺