Bird
Raised Fist0
Angularframework~20 mins

Migrating from observables to signals in Angular - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Signal Migration Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
Understanding signal updates vs observable subscriptions

Consider an Angular component migrating from an observable to a signal. Which behavior correctly describes how the component updates when the signal changes compared to the observable?

ASignals do not trigger component updates; only observables do.
BThe component automatically re-renders when the signal value changes without manual subscription management.
CThe component requires manual subscription and unsubscription to update when the signal changes.
DThe component updates only when the signal is explicitly refreshed by calling a method.
Attempts:
2 left
💡 Hint

Think about how signals simplify reactive updates compared to observables.

📝 Syntax
intermediate
2:00remaining
Correct syntax for creating a signal from an observable

Which code snippet correctly creates a signal from an observable using Angular's toSignal function?

Aconst countSignal = countObservable.toSignal(0);
Bconst countSignal = toSignal(countObservable, 0);
Cconst countSignal = toSignal(countObservable, { initialValue: 0 });
Dconst countSignal = toSignal(countObservable);
Attempts:
2 left
💡 Hint

Check the correct way to pass options to toSignal.

🔧 Debug
advanced
2:00remaining
Identifying the error when migrating observable subscription to signal

Given this Angular component code migrating from observable to signal, what error will occur?

import { Component, signal } from '@angular/core';
import { interval } from 'rxjs';
import { toSignal } from '@angular/core/rxjs-interop';

@Component({
  selector: 'app-timer',
  template: `{{ timer() }}`
})
export class TimerComponent {
  timer = toSignal(interval(1000));
}
ATypeError: toSignal requires an initialValue option for cold observables.
BSyntaxError: Missing parentheses in toSignal call.
CNo error; the code works as expected.
DRuntimeError: interval is not a function.
Attempts:
2 left
💡 Hint

Consider what happens when converting a cold observable like interval to a signal.

state_output
advanced
2:00remaining
Result of signal value after observable emits

What is the value of countSignal() after 3 seconds given this code?

import { signal } from '@angular/core';
import { interval } from 'rxjs';
import { toSignal } from '@angular/core/rxjs-interop';

const countObservable = interval(1000);
const countSignal = toSignal(countObservable, { initialValue: 0 });

setTimeout(() => {
  console.log(countSignal());
}, 3000);
A2
B0
Cundefined
DThrows an error
Attempts:
2 left
💡 Hint

Remember how interval emits values every second starting from 0.

🧠 Conceptual
expert
3:00remaining
Key advantage of signals over observables in Angular migration

What is the main advantage of migrating from observables to signals in Angular applications?

ASignals allow multiple subscribers to share the same data stream more efficiently than observables.
BSignals replace the need for Angular templates by rendering directly in TypeScript.
CSignals enable asynchronous data fetching without any need for Angular lifecycle hooks.
DSignals provide automatic change detection and simpler state management without manual subscriptions.
Attempts:
2 left
💡 Hint

Think about how signals reduce boilerplate compared to observables.

Practice

(1/5)
1. What is the main benefit of migrating from Observable to signal() in Angular?
easy
A. More complex code but better performance
B. Signals require manual subscription management
C. Simpler reactive data handling with automatic UI updates
D. Signals do not support reactive updates

Solution

  1. Step 1: Understand the purpose of signals

    Signals in Angular provide a simpler way to handle reactive data by automatically updating the UI when the data changes.
  2. Step 2: Compare with observables

    Observables require subscriptions and manual management, while signals reduce this complexity and improve performance.
  3. Final Answer:

    Simpler reactive data handling with automatic UI updates -> Option C
  4. Quick Check:

    Signals simplify reactivity = B [OK]
Hint: Signals auto-update UI, observables need subscriptions [OK]
Common Mistakes:
  • Thinking signals require manual subscriptions
  • Believing signals increase code complexity
  • Assuming signals do not update UI reactively
2. Which of the following is the correct way to create a signal in Angular?
easy
A. const count = createSignal(0);
B. const count = new Signal(0);
C. const count = observable(0);
D. const count = signal(0);

Solution

  1. Step 1: Recall Angular signal creation syntax

    Angular uses the signal() function to create reactive signals.
  2. Step 2: Check options for correct syntax

    Only const count = signal(0); matches Angular's official syntax.
  3. Final Answer:

    const count = signal(0); -> Option D
  4. Quick Check:

    Use signal() function = C [OK]
Hint: Use signal() function, not new or createSignal [OK]
Common Mistakes:
  • Using new Signal() instead of signal()
  • Confusing with createSignal() from other frameworks
  • Using observable() which is for RxJS
3. Given this Angular code migrating from observable to signal:
const count = signal(0);

function increment() {
  count.set(count() + 1);
}

increment();
increment();
console.log(count());

What will be logged to the console?
medium
A. 0
B. 2
C. undefined
D. 1

Solution

  1. Step 1: Understand signal initial value and increments

    The signal count starts at 0. Each call to increment() adds 1.
  2. Step 2: Calculate final value after two increments

    After two calls, count is 0 + 1 + 1 = 2.
  3. Final Answer:

    2 -> Option B
  4. Quick Check:

    0 + 2 increments = 2 [OK]
Hint: Signals hold value, use .set() and () to get value [OK]
Common Mistakes:
  • Forgetting to call count() to get value
  • Assuming count is immutable without .set()
  • Confusing initial value with updated value
4. What is wrong with this migration from observable to signal?
const count = signal(0);

count.subscribe(value => console.log(value));

count.set(5);
medium
A. Signals do not have a subscribe method
B. You must call count() instead of count.set()
C. Signals require new keyword to create
D. count.set() does not update the signal value

Solution

  1. Step 1: Check signal API differences from observables

    Signals do not have a subscribe method; that is an observable feature.
  2. Step 2: Identify correct way to react to signal changes

    To react to signals, use computed signals or effects, not subscribe.
  3. Final Answer:

    Signals do not have a subscribe method -> Option A
  4. Quick Check:

    Signals lack subscribe() = A [OK]
Hint: Signals use effects, not subscribe() [OK]
Common Mistakes:
  • Trying to subscribe to signals like observables
  • Confusing signal() with observable()
  • Using count() incorrectly as a setter
5. You have this observable-based Angular code:
count$ = new BehaviorSubject(0);

increment() {
  this.count$.next(this.count$.value + 1);
}

How would you migrate this to use signals correctly?
hard
A. const count = signal(0); function increment() { count.set(count() + 1); }
B. const count = signal(0); function increment() { count = count() + 1; }
C. const count = new signal(0); function increment() { count.set(count() + 1); }
D. const count = signal(0); function increment() { count.next(count() + 1); }

Solution

  1. Step 1: Replace BehaviorSubject with signal()

    Use signal(0) to create a reactive value starting at 0.
  2. Step 2: Update increment function to use .set()

    Use count.set(count() + 1) to update the signal's value correctly.
  3. Final Answer:

    const count = signal(0); function increment() { count.set(count() + 1); } -> Option A
  4. Quick Check:

    Use signal() and .set() to update = A [OK]
Hint: Use .set() to update signals, not assignment or next() [OK]
Common Mistakes:
  • Trying to assign directly to signal variable
  • Using new keyword with signal()
  • Calling next() on a signal