A BehaviorSubject lets you keep and share a value that changes over time. It works like a simple store to hold and update data in Angular apps.
BehaviorSubject as simple store in Angular
Start learning this pattern below
Jump into concepts and practice - no test required
import { BehaviorSubject } from 'rxjs'; const store = new BehaviorSubject(initialValue); // To get current value const currentValue = store.getValue(); // To update value store.next(newValue); // To listen for changes store.subscribe(value => { // react to value });
The BehaviorSubject always holds the latest value.
Subscribers get the current value right away when they subscribe.
const countStore = new BehaviorSubject(0); countStore.subscribe(value => console.log('Count:', value)); countStore.next(1); countStore.next(2);
const userStore = new BehaviorSubject({ name: 'Alice', loggedIn: false }); userStore.next({ name: 'Alice', loggedIn: true });
This Angular component uses a BehaviorSubject as a simple store to keep user info. It shows the user's name and login status. Clicking the button toggles the login state. The component updates automatically when the store changes.
import { Component } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; @Component({ selector: 'app-simple-store', template: ` <h2>User Status</h2> <p>Name: {{ user.name }}</p> <p>Status: {{ user.loggedIn ? 'Logged In' : 'Logged Out' }}</p> <button (click)="toggleLogin()">Toggle Login</button> ` }) export class SimpleStoreComponent { private userStore = new BehaviorSubject({ name: 'Alice', loggedIn: false }); user = this.userStore.value; constructor() { this.userStore.subscribe(value => { this.user = value; }); } toggleLogin() { const current = this.userStore.value; this.userStore.next({ ...current, loggedIn: !current.loggedIn }); } }
Always unsubscribe from subscriptions in real apps to avoid memory leaks (not shown here for simplicity).
BehaviorSubject requires an initial value when created.
BehaviorSubject holds and shares the latest value like a simple store.
Subscribers get the current value immediately when they subscribe.
Use next() to update the store value and notify subscribers.
Practice
BehaviorSubject in Angular as a simple store?Solution
Step 1: Understand BehaviorSubject role
BehaviorSubject holds a current value and shares it with subscribers immediately when they subscribe.Step 2: Compare with other options
The other options describe unrelated Angular features like HTTP, components, and routing.Final Answer:
To hold and share the latest value with all subscribers immediately -> Option AQuick Check:
BehaviorSubject shares latest value immediately [OK]
- Confusing BehaviorSubject with HTTP or routing
- Thinking it delays value delivery
- Assuming it creates components
BehaviorSubject named store$?Solution
Step 1: Recall BehaviorSubject update method
The method to update a BehaviorSubject's value isnext().Step 2: Check other method names
Methods likeupdate(),setValue(), andemit()do not exist on BehaviorSubject.Final Answer:
store$.next(newValue); -> Option BQuick Check:
Use next() to update BehaviorSubject [OK]
- Using update() or setValue() instead of next()
- Confusing EventEmitter with BehaviorSubject
- Trying to assign value directly
const store$ = new BehaviorSubject(0);
store$.subscribe(value => console.log('Subscriber 1:', value));
store$.next(5);
store$.subscribe(value => console.log('Subscriber 2:', value));
store$.next(10);Solution
Step 1: Trace first subscription
Subscriber 1 subscribes first and immediately receives initial value 0, then receives 5 after next(5).Step 2: Trace second subscription
Subscriber 2 subscribes after next(5), so it immediately receives current value 5.Step 3: Trace next(10) call
Both subscribers receive 10 after next(10).Final Answer:
Subscriber 1: 0 Subscriber 1: 5 Subscriber 2: 5 Subscriber 1: 10 Subscriber 2: 10 -> Option CQuick Check:
BehaviorSubject sends current value on subscribe [OK]
- Assuming second subscriber gets initial 0 instead of 5
- Missing initial value emission on subscribe
- Confusing order of console logs
BehaviorSubject as a simple store:
const store$ = new BehaviorSubject(); store$.subscribe(value => console.log(value)); store$.next(42);
Solution
Step 1: Check BehaviorSubject constructor
BehaviorSubject requires an initial value passed to its constructor; here it is missing.Step 2: Validate other statements
Calling next() after subscribe() is valid; subscribe() accepts a function; BehaviorSubject can emit numbers.Final Answer:
BehaviorSubject requires an initial value when created -> Option DQuick Check:
BehaviorSubject must have initial value [OK]
- Omitting initial value in constructor
- Thinking next() can't be called after subscribe()
- Confusing subscribe() argument types
BehaviorSubject to hold a user's profile object and update it safely. Which approach correctly updates only the user's name without losing other profile data?
const profile$ = new BehaviorSubject({ name: 'Alice', age: 30 });
// Update name to 'Bob' hereSolution
Step 1: Understand BehaviorSubject value update
Directly assigning to value property does not notify subscribers; next() must be called with full updated object.Step 2: Preserve existing data while updating name
Use spread operator to copy existing profile and override name, then call next() with new object.Step 3: Check other options
profile$.next({ name: 'Bob' }); loses age property; profile$.value.name = 'Bob'; mutates value without notification; profile$.update({ name: 'Bob' }); uses non-existent update() method.Final Answer:
profile$.next({ ...profile$.value, name: 'Bob' }); -> Option AQuick Check:
Use next() with spread to update partial data [OK]
- Overwriting entire object losing other properties
- Mutating value directly without next()
- Using non-existent update() method
