Bird
Raised Fist0
Angularframework~10 mins

ngDoCheck for custom change detection in Angular - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to implement the ngDoCheck lifecycle hook in an Angular component.

Angular
import { Component, [1] } from '@angular/core';

@Component({
  selector: 'app-check',
  template: `<p>Check example</p>`
})
export class CheckComponent implements [1] {
  ngDoCheck() {
    console.log('Custom change detection running');
  }
}
Drag options to blanks, or click blank then click option'
ADoCheck
BOnChanges
CAfterViewInit
DOnInit
Attempts:
3 left
💡 Hint
Common Mistakes
Using OnInit instead of DoCheck
Forgetting to implement the DoCheck interface
2fill in blank
medium

Complete the code to detect changes manually inside ngDoCheck.

Angular
import { Component, DoCheck, ChangeDetectorRef } from '@angular/core';

@Component({
  selector: 'app-manual-check',
  template: `<p>{{message}}</p>`
})
export class ManualCheckComponent implements DoCheck {
  message = 'Initial';

  constructor(private cdr: [1]) {}

  ngDoCheck() {
    this.message = 'Checked';
    this.cdr.detectChanges();
  }
}
Drag options to blanks, or click blank then click option'
AChangeDetectorRef
BNgZone
CRenderer2
DElementRef
Attempts:
3 left
💡 Hint
Common Mistakes
Injecting NgZone instead of ChangeDetectorRef
Calling detectChanges on the wrong service
3fill in blank
hard

Fix the error in the ngDoCheck method to avoid infinite loops.

Angular
ngDoCheck() {
  if (this.value !== this.previousValue) {
    this.previousValue = this.value;
    this.message = 'Value changed';
    [1];
  }
}
Drag options to blanks, or click blank then click option'
Athis.cdr.reattach()
Bthis.cdr.markForCheck()
Cthis.cdr.detach()
Dthis.cdr.detectChanges()
Attempts:
3 left
💡 Hint
Common Mistakes
Calling detectChanges inside ngDoCheck causing infinite loops
Not marking the component for check
4fill in blank
hard

Fill both blanks to create a custom change detection that compares old and new values.

Angular
export class CustomCheckComponent implements DoCheck {
  oldValue = '';
  newValue = 'Hello';

  ngDoCheck() {
    if (this.newValue [1] this.oldValue) {
      this.oldValue = this.newValue;
      console.log('Value changed:', this.newValue);
    }
  }
}
Drag options to blanks, or click blank then click option'
A===
B!=
C==
D!==
Attempts:
3 left
💡 Hint
Common Mistakes
Using == instead of !== causing false positives
Using === which checks for equality, not difference
5fill in blank
hard

Fill all three blanks to implement ngDoCheck with manual change detection and previous value tracking.

Angular
export class TrackValueComponent implements DoCheck {
  previousValue = '';
  currentValue = 'Angular';

  constructor(private [1]: ChangeDetectorRef) {}

  ngDoCheck() {
    if (this.currentValue [2] this.previousValue) {
      this.previousValue = this.currentValue;
      this.[3].markForCheck();
    }
  }
}
Drag options to blanks, or click blank then click option'
Acdr
B!==
D===
EchangeDetector
FdetectChanges
GmarkForCheck
HcdRef
Attempts:
3 left
💡 Hint
Common Mistakes
Using === instead of !== for comparison
Calling detectChanges inside ngDoCheck causing loops
Using wrong variable names for ChangeDetectorRef

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