Mastering Angular Lifecycle Hooks
In Angular, every component has a lifecycle. From the moment it is created to the moment it is removed from the DOM, Angular manages its existence through a series of events known as Lifecycle Hooks. Understanding these hooks is essential for managing data, interacting with the DOM, and optimizing application performance.
What are Lifecycle Hooks?
Lifecycle hooks are special methods provided by Angular that allow developers to "tap into" specific moments in a component's life. Whether you need to fetch data from a server when a component loads or clean up resources before it is destroyed, lifecycle hooks provide the necessary entry points.
The Angular Lifecycle Flow
Angular executes these hooks in a specific order. Here is a text-based representation of the sequence:
[ Component Constructor ]
|
v
[ ngOnChanges ] (Whenever @Input properties change)
|
v
[ ngOnInit ] (Once, after the first ngOnChanges)
|
v
[ ngDoCheck ] (During every change detection cycle)
|
v
[ ngAfterContentInit ] (After external content is projected)
|
v
[ ngAfterContentChecked ]
|
v
[ ngAfterViewInit ] (After component and child views are ready)
|
v
[ ngAfterViewChecked ]
|
v
[ ngOnDestroy ] (Just before the component is removed)
Key Lifecycle Hooks Explained
1. ngOnInit
This is the most commonly used hook. It runs once after Angular has finished initializing the component's data-bound properties. It is the best place to perform initialization logic, such as calling a service to fetch data from an API.
export class UserComponent implements OnInit {
ngOnInit() {
console.log('Component initialized!');
// Fetch data here
}
}
2. ngOnChanges
This hook is triggered whenever an @Input() property changes. It receives a SimpleChanges object containing the current and previous values of the property. This is highly useful for reacting to data passed from a parent component.
3. ngAfterViewInit
This hook is called after Angular has fully initialized the component's view and its child views. If you need to interact with the DOM directly or use @ViewChild, this is the correct place to do it.
4. ngOnDestroy
This is the cleanup phase. It runs just before Angular destroys the component. Use this hook to unsubscribe from Observables, detach event listeners, and stop timers to prevent memory leaks.
export class SearchComponent implements OnDestroy {
private subscription: Subscription;
ngOnDestroy() {
this.subscription.unsubscribe();
console.log('Cleanup complete');
}
}
Real-World Use Cases
- Data Fetching: Use
ngOnInitto trigger HTTP requests when a page loads. - Animation Triggers: Use
ngAfterViewInitto start third-party animation libraries that require the DOM to be ready. - Form Resetting: Use
ngOnChangesto reset a child form when a "Clear" signal is sent from a parent component. - Memory Management: Use
ngOnDestroyto close WebSocket connections or clearsetIntervaltasks.
Common Mistakes to Avoid
- Constructor vs ngOnInit: Do not put complex logic or API calls in the
constructor. The constructor is a JavaScript feature for class instantiation, whilengOnInitis an Angular feature where bindings are actually available. - Infinite Loops in ngDoCheck: Avoid updating state variables inside
ngDoCheckorngAfterViewCheckedwithout strict conditions, as this can trigger additional change detection cycles and crash the browser. - Forgetting to Unsubscribe: Failing to use
ngOnDestroyto unsubscribe from long-lived Observables is a leading cause of memory leaks in Angular applications.
Interview Notes: Frequently Asked Questions
- Question: What is the difference between
ngOnInitand theconstructor? - Answer: The constructor is called when the class is instantiated, but Angular hasn't finished setting up the component inputs yet.
ngOnInitis called after the firstngOnChanges, meaning all input properties are available for use. - Question: Which hook is called most frequently?
- Answer:
ngDoCheck,ngAfterContentChecked, andngAfterViewCheckedare called during every change detection cycle, making them very frequent. - Question: How do you detect changes in an @Input property?
- Answer: By implementing the
ngOnChangeshook and inspecting theSimpleChangesobject.
Internal Links and Further Reading
To master Angular, it is important to understand how these hooks interact with Angular Components and Data Binding. In our previous lessons, we discussed how components are structured; lifecycle hooks are the "engine" that drives those structures. In the next lesson, we will explore Template Driven Forms and how lifecycle hooks can help manage form states.
Summary
Mastering Angular Lifecycle Hooks is a milestone for any developer. By using ngOnInit for initialization, ngOnChanges for input tracking, and ngOnDestroy for cleanup, you ensure your application is efficient, bug-free, and easy to maintain. Always remember the order of execution to avoid "Expression Changed After It Has Been Checked" errors and to write professional-grade Angular code.