⏱️ AngularJS Component Lifecycle (2025 Guide)
🧲 Introduction – Why Learn the AngularJS Component Lifecycle?
When working with AngularJS components, especially in dynamic and interactive applications, understanding the component lifecycle is essential. It helps developers control initialization, detect changes in data, handle cleanup, and manage inter-component communication effectively.
In AngularJS 1.5 and later, components were enhanced to include lifecycle hooks, similar to Angular 2+, React, and Vue—offering better control over the behavior of components during their lifespan.
🎯 In this guide, you’ll learn:
- What the component lifecycle is in AngularJS
- The key lifecycle hooks available
- When and how each hook is triggered
- Code examples showing best practices
🔄 What Is the Component Lifecycle in AngularJS?
The component lifecycle in AngularJS refers to a series of predefined methods (hooks) that are executed at different stages during a component’s existence—from creation to destruction.
Lifecycle hooks in AngularJS are implemented as methods inside the component’s controller.
🧩 AngularJS Lifecycle Hooks – Overview Table
🔁 Hook Name | 🕒 Triggered When… | 🔎 Purpose |
---|---|---|
$onInit() | Component is initialized | Setup component state, fetch data |
$onChanges(changes) | One-way bindings (< ) change | Respond to input changes from parent |
$doCheck() | Digest cycle runs | Detect custom changes manually |
$onDestroy() | Component is destroyed | Cleanup (intervals, DOM, watchers, etc.) |
$postLink() | Component’s DOM is ready | DOM manipulation or jQuery integration |
✅ 1. $onInit()
– Initialization
Called once after all bindings are initialized.
app.component('userCard', {
template: `<p>{{ $ctrl.message }}</p>`,
controller: function() {
this.$onInit = function() {
this.message = "Component Initialized!";
};
}
});
🧾 Use Cases:
- Initialize component state
- Load default values
- Call services to fetch data
🔁 2. $onChanges(changesObj)
– Input Binding Updates
Called when @
or <
bindings from parent are updated.
app.component('userProfile', {
bindings: {
username: '<'
},
controller: function() {
this.$onChanges = function(changes) {
if (changes.username) {
console.log("Username updated:", changes.username.currentValue);
}
};
},
template: `<p>Hello, {{$ctrl.username}}</p>`
});
🧾 Use Cases:
- Respond to input property changes
- Validate new values before rendering
🧠 3. $doCheck()
– Custom Change Detection
Called on each digest cycle. Use when $onChanges
isn’t sufficient.
app.component('watcherComp', {
bindings: {
data: '<'
},
controller: function() {
this.previousValue = '';
this.$doCheck = function() {
if (this.data !== this.previousValue) {
console.log("Data changed manually");
this.previousValue = this.data;
}
};
},
template: `<p>{{ $ctrl.data }}</p>`
});
🧾 Use Cases:
- Track changes in complex/nested objects
- Implement custom diff logic
🧱 4. $postLink()
– DOM Ready
Called after the component is linked to the DOM. Use it for DOM-dependent logic.
app.component('focusInput', {
template: `<input id="nameInput">`,
controller: function() {
this.$postLink = function() {
document.getElementById('nameInput').focus();
};
}
});
🧾 Use Cases:
- DOM manipulation
- Integrate with jQuery or third-party plugins
🧹 5. $onDestroy()
– Cleanup
Called before the component is removed from the DOM.
app.component('timerComp', {
template: `<p>Timer: {{$ctrl.seconds}}</p>`,
controller: function($interval) {
let intervalRef;
this.seconds = 0;
this.$onInit = () => {
intervalRef = $interval(() => this.seconds++, 1000);
};
this.$onDestroy = () => {
$interval.cancel(intervalRef);
console.log("Component destroyed.");
};
}
});
🧾 Use Cases:
- Cancel timers or intervals
- Unbind event listeners
- Clear memory or DOM references
🧪 Real-World Lifecycle Usage Example
app.component('dataViewer', {
bindings: {
records: '<'
},
template: `
<div>
<h3>Data Viewer</h3>
<ul>
<li ng-repeat="item in $ctrl.records">{{ item }}</li>
</ul>
</div>
`,
controller: function() {
this.$onInit = function() {
console.log("Component initialized.");
};
this.$onChanges = function(changes) {
console.log("Received new data:", changes.records);
};
this.$onDestroy = function() {
console.log("Viewer destroyed.");
};
}
});
💡 Best Practices for Component Lifecycle
✔️ Use $onInit()
to initialize state, not the constructor
✔️ Always cancel intervals/timeouts inside $onDestroy()
✔️ Use $onChanges()
for <
bindings and external inputs
✔️ Avoid heavy logic inside $doCheck()
to maintain performance
✔️ Use $postLink()
only when DOM manipulation is required
📌 Summary – Recap & Next Steps
Understanding the AngularJS component lifecycle helps you build more predictable, modular, and performant apps. Each lifecycle hook serves a purpose and should be used strategically.
🔍 Key Takeaways:
$onInit()
is used for setup,$onDestroy()
for cleanup.$onChanges()
responds to bound data updates.$postLink()
and$doCheck()
offer DOM and manual change detection hooks.
⚙️ Real-world Relevance:
Lifecycle hooks are indispensable when integrating third-party libraries, optimizing performance, or debugging complex data flow in enterprise AngularJS apps.
❓ FAQ – AngularJS Component Lifecycle
❓ What is the difference between $onInit()
and $onChanges()
?
✅ $onInit()
runs once after the controller is initialized. $onChanges()
runs whenever input bindings (<
) change from parent to child.
❓ Is $doCheck()
required in most components?
✅ No. Use it only when you need custom change detection that $onChanges()
can’t handle.
❓ Can I use all hooks in any AngularJS version?
✅ Lifecycle hooks were introduced in AngularJS 1.5+. Make sure you’re using this version or later.
❓ Why use $onDestroy()
in AngularJS?
✅ It’s essential for cleaning up resources (e.g., event listeners, intervals) to prevent memory leaks.
Share Now :