Bird
Raised Fist0
Angularframework~30 mins

ngDoCheck for custom change detection in Angular - Mini Project: Build & Apply

Choose your learning style10 modes available
Using ngDoCheck for Custom Change Detection in Angular
📖 Scenario: You are building a simple Angular component that tracks a list of tasks. You want to detect changes to the tasks array manually using Angular's ngDoCheck lifecycle hook instead of relying on default change detection.This helps when you want to perform custom checks, like detecting changes inside an array or object that Angular's default change detection might miss.
🎯 Goal: Create an Angular standalone component that holds a list of tasks. Use ngDoCheck to detect when the tasks array changes by comparing its length. When a change is detected, update a message showing the number of tasks.
📋 What You'll Learn
Create a standalone Angular component named TaskListComponent with a tasks array containing exactly these strings: 'Buy groceries', 'Walk the dog', 'Read a book'
Add a variable previousTaskCount to store the previous length of the tasks array
Implement the ngDoCheck lifecycle hook to compare the current length of tasks with previousTaskCount
Update a message string to say 'Task list updated: X tasks' when a change is detected, where X is the current number of tasks
Add a button in the template to add a new task 'New Task' to the tasks array
Display the message and the list of tasks in the template
💡 Why This Matters
🌍 Real World
Custom change detection is useful when working with complex data structures or performance-sensitive apps where Angular's default detection is not enough or too costly.
💼 Career
Understanding ngDoCheck helps developers optimize Angular apps and handle edge cases in change detection, a valuable skill for frontend Angular developers.
Progress0 / 4 steps
1
Create the initial tasks array
Create a standalone Angular component named TaskListComponent. Inside it, create a public array called tasks with these exact strings: 'Buy groceries', 'Walk the dog', and 'Read a book'.
Angular
Hint

Remember to create the tasks array exactly with the three strings given.

2
Add previousTaskCount variable
Inside the TaskListComponent, add a public variable called previousTaskCount and set it to the length of the tasks array.
Angular
Hint

Set previousTaskCount equal to this.tasks.length.

3
Implement ngDoCheck to detect changes
Implement the ngDoCheck lifecycle hook method inside TaskListComponent. Inside it, compare this.tasks.length with this.previousTaskCount. If they differ, update this.previousTaskCount to the new length and set a public string variable message to 'Task list updated: X tasks', where X is the current number of tasks.
Angular
Hint

Use implements DoCheck and define the ngDoCheck() method. Compare lengths and update message accordingly.

4
Add template with button and display
Add the component template inside the @Component decorator. It should have a button with text Add Task that adds the string 'New Task' to the tasks array when clicked. Below the button, display the message in a paragraph and list all tasks using an unordered list with *ngFor.
Angular
Hint

Use (click)="addTask()" on the button and *ngFor="let task of tasks" to list tasks.

Practice

(1/5)
1. What is the main purpose of the ngDoCheck lifecycle hook in Angular?
easy
A. To run custom change detection logic when Angular's default detection misses changes.
B. To initialize component data before rendering.
C. To handle user input events like clicks and keypresses.
D. To destroy the component and clean up resources.

Solution

  1. Step 1: Understand Angular's default change detection

    Angular automatically detects changes for simple data types but can miss changes in complex objects or arrays.
  2. Step 2: Role of ngDoCheck

    ngDoCheck allows developers to add custom checks to detect changes Angular might miss.
  3. Final Answer:

    To run custom change detection logic when Angular's default detection misses changes. -> Option A
  4. Quick Check:

    ngDoCheck = custom change detection [OK]
Hint: Remember: ngDoCheck is for custom checks Angular misses [OK]
Common Mistakes:
  • Confusing ngDoCheck with ngOnInit or ngOnDestroy
  • Thinking ngDoCheck handles user events
  • Assuming ngDoCheck replaces Angular's default detection
2. Which of the following is the correct syntax to implement ngDoCheck in an Angular component?
easy
A. ngDoCheck() { console.log('Checking changes'); }
B. ngDoCheck: function() { console.log('Checking changes'); }
C. function ngDoCheck() { console.log('Checking changes'); }
D. ngDoCheck => { console.log('Checking changes'); }

Solution

  1. Step 1: Recognize Angular lifecycle hook syntax

    Angular lifecycle hooks are methods inside the component class with no special syntax like arrow functions or function keywords.
  2. Step 2: Identify correct method declaration

    ngDoCheck() { console.log('Checking changes'); } shows the correct method syntax inside a class: ngDoCheck() { ... }.
  3. Final Answer:

    ngDoCheck() { console.log('Checking changes'); } -> Option A
  4. Quick Check:

    ngDoCheck is a class method, not a function expression [OK]
Hint: Use method syntax inside class for lifecycle hooks [OK]
Common Mistakes:
  • Using arrow functions for lifecycle hooks
  • Adding function keyword inside class
  • Using object literal syntax for hooks
3. Consider this Angular component snippet:
items = [1, 2, 3];

ngDoCheck() {
  if (this.items.length !== this.oldLength) {
    console.log('Items changed');
    this.oldLength = this.items.length;
  }
}

What will be logged if items.push(4) is called and Angular runs change detection?
medium
A. Error: oldLength is undefined
B. Nothing is logged
C. Items changed twice
D. Items changed

Solution

  1. Step 1: Check initialization of oldLength

    The code uses this.oldLength but it is never initialized, so it's undefined initially.
  2. Step 2: Runtime behavior after items.push(4)

    this.items.length becomes 4, and 4 !== undefined is true, so 'Items changed' is logged. No error occurs.
  3. Final Answer:

    Items changed -> Option D
  4. Quick Check:

    4 !== undefined -> true, logs [OK]
Hint: Always initialize variables used in ngDoCheck before use [OK]
Common Mistakes:
  • Assuming oldLength is automatically defined
  • Expecting ngDoCheck to detect changes without setup
  • Thinking accessing undefined properties causes runtime errors
4. Given this ngDoCheck implementation:
ngDoCheck() {
  if (this.data !== this.oldData) {
    this.processData();
    this.oldData = this.data;
  }
}

Why might processData() never be called even if data changes internally (like modifying a property inside an object)?
medium
A. Because ngDoCheck only runs once per component.
B. Because !== compares object references, not internal changes.
C. Because processData() is not a valid method.
D. Because oldData is not declared.

Solution

  1. Step 1: Understand object reference comparison

    The !== operator checks if two variables point to different objects, not if the content inside objects changed.
  2. Step 2: Effect on ngDoCheck logic

    If data is the same object but its properties change, this.data !== this.oldData is false, so processData() is not called.
  3. Final Answer:

    Because !== compares object references, not internal changes. -> Option B
  4. Quick Check:

    Object reference check misses internal mutations [OK]
Hint: Use deep checks or immutable objects for internal changes [OK]
Common Mistakes:
  • Thinking !== detects internal object changes
  • Assuming ngDoCheck runs only once
  • Ignoring method existence or variable declaration
5. You want to detect changes inside a nested object profile in ngDoCheck. Which approach correctly detects changes to any property inside profile without replacing the whole object?
hard
A. Call detectChanges() manually inside ngDoCheck.
B. Only check if profile !== oldProfile using reference equality.
C. Use a deep comparison function inside ngDoCheck to compare profile with a saved copy.
D. Replace profile with a new object every time a property changes.

Solution

  1. Step 1: Understand limitations of reference checks

    Reference checks only detect if the object itself changed, not internal property changes.
  2. Step 2: Use deep comparison for nested changes

    A deep comparison function compares all nested properties to detect any internal changes.
  3. Step 3: Avoid unnecessary object replacement

    Replacing the whole object every time is inefficient; deep comparison allows detecting changes without replacement.
  4. Final Answer:

    Use a deep comparison function inside ngDoCheck to compare profile with a saved copy. -> Option C
  5. Quick Check:

    Deep compare nested objects for internal changes [OK]
Hint: Deep compare objects to detect internal changes [OK]
Common Mistakes:
  • Relying on reference equality for nested objects
  • Manually calling detectChanges inside ngDoCheck
  • Replacing whole object unnecessarily
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard