Signals help keep track of changing data in your app simply and clearly. They make your app update automatically when data changes.
Signals as modern state primitive in Angular
Start learning this pattern below
Jump into concepts and practice - no test required
import { Component, signal } from '@angular/core'; @Component({ selector: 'app-counter', standalone: true, template: ` <button (click)="increment()">Increment</button> <p>Count: {{ count() }}</p> ` }) export class CounterComponent { count = signal(0); increment() { this.count.update(current => current + 1); } }
The signal function creates a reactive value that you can read by calling it like a function.
Use update to change the signal's value based on its current value.
const count = signal(0); console.log(count()); // 0 count.set(5); console.log(count()); // 5
const name = signal('Alice'); name.set('Bob'); console.log(name()); // Bob
update to add 5 to the current score.const score = signal(10); score.update(current => current + 5); console.log(score()); // 15
const emptySignal = signal(null); console.log(emptySignal()); // null
This component uses a signal to keep track of how many times the button is clicked. Each click updates the signal, and the UI updates automatically.
import { Component, signal } from '@angular/core'; @Component({ selector: 'app-click-tracker', standalone: true, template: ` <button (click)="trackClick()">Click me</button> <p>You clicked {{ clicks() }} times.</p> ` }) export class ClickTrackerComponent { clicks = signal(0); trackClick() { this.clicks.update(currentClicks => currentClicks + 1); } } // When the button is clicked 3 times, the displayed text updates automatically to: // You clicked 3 times.
Signals update synchronously and immediately notify any part of the app that uses them.
Time complexity for reading or updating a signal is O(1).
Common mistake: forgetting to call the signal as a function to read its value (e.g., use count() not count).
Use signals for simple, local state. For complex shared state, consider Angular's other state management tools.
Signals are simple reactive values that update your UI automatically.
Use signal() to create, call the signal like a function to read (e.g., count()), and set() or update() to change values.
They help keep your code clean and your app responsive.
Practice
signal() in Angular?Solution
Step 1: Understand the role of
signal()signal()creates a reactive value that Angular tracks for changes.Step 2: Connect
When the signal value changes, Angular automatically updates the UI where it is used.signal()to UI updatesFinal Answer:
To create a reactive state value that updates the UI automatically -> Option BQuick Check:
signal() creates reactive state [OK]
- Confusing signals with components
- Thinking signals handle HTTP
- Assuming signals are for styling
Solution
Step 1: Recall the syntax for creating signals
Angular usessignal(initialValue)to create a signal with a starting value.Step 2: Check each option's syntax
Onlyconst count = signal(10);matches the correct syntax. Others use incorrect constructors or methods.Final Answer:
const count = signal(10); -> Option AQuick Check:
signal() creates with initial value [OK]
- Using new keyword with signal
- Calling non-existent createSignal function
- Trying to set value during creation
const count = signal(0); count.set(5); console.log(count());
What will be printed in the console?
Solution
Step 1: Understand signal creation and update
The signalcountstarts at 0, thenset(5)changes its value to 5.Step 2: Reading the signal value
Callingcount()returns the current value, which is 5 after the update.Final Answer:
5 -> Option AQuick Check:
count.set(5) updates value, count() reads it [OK]
- Thinking count() returns initial value
- Confusing set() with reading value
- Assuming count is not callable
const name = signal('Alice');
name.update(name + ' Smith');Solution
Step 1: Understand update() usage
update()expects a function that receives the current value and returns the new value.Step 2: Analyze the code's argument to update()
The code passesname + ' Smith'which is a string, not a function, causing an error.Final Answer:
Using update() with a string instead of a function -> Option CQuick Check:
update() needs a function argument [OK]
- Passing value directly to update()
- Confusing set() and update() usage
- Ignoring function argument requirement
Solution
Step 1: Understand how to update array signals
Signals hold values immutably; to add an item, create a new array with the old items plus the new one.Step 2: Check each option's correctness
numbers.update(list => [...list, 7]); usesupdate()with a function that returns a new array including 7, which is correct.
numbers.set(numbers() + 7); tries to add 7 to an array directly, causing a type error.
numbers = signal([...numbers(), 7]); tries to reassign the signal variable, which is incorrect.
numbers.push(7); callspush()on the signal itself, which is not valid.Final Answer:
numbers.update(list => [...list, 7]); -> Option DQuick Check:
Use update() with function returning new array [OK]
- Trying to mutate signal value directly
- Reassigning signal variable instead of updating
- Using set() with wrong value type
