Bird
Raised Fist0
Angularframework~10 mins

Performance impact of 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 create a standalone Angular component with OnPush change detection.

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

@Component({
  selector: 'app-sample',
  template: `<p>Sample works!</p>`,
  changeDetection: ChangeDetectionStrategy.[1],
  standalone: true
})
export class SampleComponent {}
Drag options to blanks, or click blank then click option'
ACheckOnce
BOnPush
CDetached
DDefault
Attempts:
3 left
💡 Hint
Common Mistakes
Using Default strategy causes Angular to check the component every time change detection runs.
Detached and CheckOnce are less commonly used and not the best for this example.
2fill in blank
medium

Complete the code to inject the ChangeDetectorRef and mark the component for check.

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

@Component({
  selector: 'app-checker',
  template: `<button (click)="update()">Update</button>`,
  standalone: true
})
export class CheckerComponent {
  constructor(private cdr: ChangeDetectorRef) {}

  update() {
    // some update logic
    this.cdr.[1]();
  }
}
Drag options to blanks, or click blank then click option'
AdetectChanges
BcheckNoChanges
CmarkForCheck
Ddetach
Attempts:
3 left
💡 Hint
Common Mistakes
Using detectChanges runs change detection immediately, which is not always desired.
detach stops change detection for the component.
3fill in blank
hard

Fix the error in the code to prevent unnecessary change detection cycles.

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

@Component({
  selector: 'app-list',
  template: `<ul><li *ngFor="let item of items">{{item}}</li></ul>`,
  changeDetection: ChangeDetectionStrategy.[1],
  standalone: true
})
export class ListComponent {
  items = [1, 2, 3];

  addItem(newItem: number) {
    this.items.push(newItem);
  }
}
Drag options to blanks, or click blank then click option'
ADefault
BOnPush
CCheckAlways
DDetached
Attempts:
3 left
💡 Hint
Common Mistakes
Using OnPush without immutable updates causes UI not to update.
Detached disables change detection, so updates won't show.
4fill in blank
hard

Fill both blanks to create an immutable update and use OnPush change detection.

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

@Component({
  selector: 'app-items',
  template: `<ul><li *ngFor="let item of items">{{item}}</li></ul>`,
  changeDetection: ChangeDetectionStrategy.[1],
  standalone: true
})
export class ItemsComponent {
  items = [1, 2, 3];

  addItem(newItem: number) {
    this.items = this.items.[2]([newItem]);
  }
}
Drag options to blanks, or click blank then click option'
AOnPush
BDefault
Cconcat
Dpush
Attempts:
3 left
💡 Hint
Common Mistakes
Using push mutates the array and does not trigger OnPush change detection.
Using Default change detection with immutable updates is less efficient.
5fill in blank
hard

Fill all three blanks to optimize change detection with a trackBy function in *ngFor.

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

@Component({
  selector: 'app-users',
  template: `
    <ul>
      <li *ngFor="let user of users; trackBy: [1]">{{user.name}}</li>
    </ul>
  `,
  changeDetection: ChangeDetectionStrategy.[2],
  standalone: true
})
export class UsersComponent {
  users = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];

  [3](index: number, user: { id: number; name: string }) {
    return user.id;
  }
}
Drag options to blanks, or click blank then click option'
AtrackById
BOnPush
CDefault
DtrackByUser
Attempts:
3 left
💡 Hint
Common Mistakes
Mismatching trackBy function names between template and class.
Using Default change detection without trackBy can cause unnecessary re-renders.

Practice

(1/5)
1. What is the main purpose of Angular's change detection?
easy
A. To manage routing between pages
B. To compile TypeScript code
C. To handle user authentication
D. To update the view when data changes

Solution

  1. Step 1: Understand change detection role

    Change detection in Angular watches for data changes to update the screen accordingly.
  2. Step 2: Identify the correct purpose

    Updating the view when data changes matches the role of change detection.
  3. Final Answer:

    To update the view when data changes -> Option D
  4. Quick Check:

    Change detection updates view [OK]
Hint: Change detection updates the screen on data change [OK]
Common Mistakes:
  • Confusing change detection with routing
  • Thinking it compiles code
  • Mixing it with authentication
2. Which syntax correctly sets the change detection strategy to OnPush in an Angular component?
easy
A. @Component({ detectionStrategy: OnPush })
B. @Component({ changeDetection: ChangeDetectionStrategy.Default })
C. @Component({ changeDetection: ChangeDetectionStrategy.OnPush })
D. @Component({ changeDetectionStrategy: 'OnPush' })

Solution

  1. Step 1: Recall correct property name

    The property to set change detection is 'changeDetection' inside @Component decorator.
  2. Step 2: Use correct enum value

    The enum value for OnPush is ChangeDetectionStrategy.OnPush, not a string or other property name.
  3. Final Answer:

    @Component({ changeDetection: ChangeDetectionStrategy.OnPush }) -> Option C
  4. Quick Check:

    Use changeDetection with ChangeDetectionStrategy.OnPush [OK]
Hint: Use changeDetection: ChangeDetectionStrategy.OnPush exactly [OK]
Common Mistakes:
  • Using wrong property name like detectionStrategy
  • Passing 'OnPush' as string
  • Confusing Default with OnPush
3. Given this Angular component with OnPush strategy:
  @Component({
    selector: 'app-counter',
    template: `{{ counter }}`,
    changeDetection: ChangeDetectionStrategy.OnPush
  })
  export class CounterComponent {
    @Input() counter = 0;
  }

What happens if the parent updates counter by setting the same number value again?
medium
A. The component view updates because input changed
B. The component view does not update because value is unchanged
C. Angular throws an error due to OnPush
D. The component view updates only after manual detectChanges call

Solution

  1. Step 1: Understand OnPush behavior with inputs

    OnPush triggers change detection only if input references change or events occur.
  2. Step 2: Same primitive value means no change

    Setting the same number value again does not change the input reference or value.
  3. Final Answer:

    The component view does not update because value is unchanged -> Option B
  4. Quick Check:

    OnPush skips unchanged input values [OK]
Hint: OnPush skips updates if input value unchanged [OK]
Common Mistakes:
  • Assuming view always updates on input set
  • Thinking OnPush causes errors
  • Believing manual detectChanges is always needed
4. You have an Angular component using Default change detection. The component updates slowly. Which fix improves performance?
medium
A. Switch to OnPush change detection strategy
B. Remove all @Input properties
C. Use setTimeout to delay updates
D. Disable change detection entirely

Solution

  1. Step 1: Identify performance issue cause

    Default strategy checks all components frequently, which can slow large apps.
  2. Step 2: Apply OnPush to reduce checks

    OnPush limits checks to when inputs change or events happen, improving speed.
  3. Final Answer:

    Switch to OnPush change detection strategy -> Option A
  4. Quick Check:

    OnPush improves performance by fewer checks [OK]
Hint: Use OnPush to reduce unnecessary checks [OK]
Common Mistakes:
  • Removing inputs breaks data flow
  • Using setTimeout doesn't fix detection speed
  • Disabling detection breaks UI updates
5. In a large Angular app, you want to optimize change detection. You have a parent component with Default strategy and a child with OnPush. The parent updates a complex object property but mutates it instead of replacing it. What is the impact on the child component's view update?
hard
A. Child view does not update because OnPush checks object reference
B. Child view updates because parent changed object property
C. Child view updates only if detectChanges is called manually
D. Child view updates automatically regardless of mutation

Solution

  1. Step 1: Understand OnPush and object mutation

    OnPush triggers on input reference changes, not internal mutations.
  2. Step 2: Mutation keeps same object reference

    Mutating object property does not change the reference, so OnPush skips update.
  3. Step 3: Child view remains unchanged without manual trigger

    Without new reference or manual detection, child view won't update.
  4. Final Answer:

    Child view does not update because OnPush checks object reference -> Option A
  5. Quick Check:

    OnPush needs new object reference to update [OK]
Hint: OnPush tracks object references, not internal mutations [OK]
Common Mistakes:
  • Assuming mutation triggers update
  • Thinking child updates automatically
  • Forgetting manual detectChanges option
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