Loading states show users that data is being fetched or processed. Error patterns help users understand when something goes wrong and how to fix it.
Loading states and error patterns in Angular
import { Component, signal } from '@angular/core'; @Component({ selector: 'app-loading-error', standalone: true, template: ` <div *ngIf="loading()">Loading...</div> <div *ngIf="error()" role="alert">Error: {{ error() }}</div> <div *ngIf="!loading() && !error()">Data loaded successfully!</div> ` }) export class LoadingErrorComponent { loading = signal(true); error = signal<string | null>(null); constructor() { // Simulate data fetch setTimeout(() => { this.loading.set(false); // Uncomment next line to simulate error // this.error.set('Failed to load data'); }, 2000); } }
Use *ngIf to show or hide loading and error messages.
Use Angular signals or reactive variables to track loading and error states.
<div *ngIf="loading()">Loading...</div> <div *ngIf="error()" role="alert">Error: {{ error() }}</div>
loading = signal(true); error = signal<string | null>(null);
setTimeout(() => { loading.set(false); error.set('Network error'); }, 3000);
This Angular standalone component shows a loading message while data is fetched. After 2 seconds, it randomly shows either a success message or an error message. The user can click the reload button to try again. The error message uses role="alert" for accessibility, and loading uses aria-live="polite" to announce updates.
import { Component, signal } from '@angular/core'; @Component({ selector: 'app-loading-error', standalone: true, template: ` <main> <h1>Data Fetch Example</h1> <div *ngIf="loading()" aria-live="polite">Loading data, please wait...</div> <div *ngIf="error()" role="alert" style="color: red;">Error: {{ error() }}</div> <div *ngIf="!loading() && !error()">Data loaded successfully!</div> <button (click)="reload()">Reload Data</button> </main> ` }) export class LoadingErrorComponent { loading = signal(true); error = signal<string | null>(null); constructor() { this.fetchData(); } fetchData() { this.loading.set(true); this.error.set(null); setTimeout(() => { this.loading.set(false); // Simulate random error or success if (Math.random() < 0.5) { this.error.set('Failed to load data. Please try again.'); } }, 2000); } reload() { this.fetchData(); } }
Always provide clear messages so users know what is happening.
Use ARIA roles like role="alert" for error messages to help screen readers.
Keep loading states visible until data is ready or an error occurs.
Loading states tell users to wait while data loads.
Error patterns show helpful messages when something goes wrong.
Use Angular signals and *ngIf to manage and display these states clearly.
Practice
Solution
Step 1: Understand loading state purpose
Loading states are used to show users that data is being fetched and they need to wait.Step 2: Analyze options
Only "To inform the user that data is being fetched and they should wait" correctly describes this purpose. The other options describe incorrect or unrelated behaviors.Final Answer:
To inform the user that data is being fetched and they should wait -> Option DQuick Check:
Loading state = Inform user to wait [OK]
- Thinking loading hides the component completely
- Assuming loading refreshes the page
- Believing loading disables all interactions permanently
isLoading signal is true?Solution
Step 1: Understand Angular signals usage
Signals are functions, so to get their value, you call them likeisLoading().Step 2: Check each option
<div *ngIf="isLoading()">Loading...</div>correctly callsisLoading().<div *ngIf="isLoading">Loading...</div>treats it as a property, which is incorrect for signals.<div *ngIf="isLoading = true">Loading...</div>uses assignment inside *ngIf, which is invalid.<div *ngIf="isLoading == false">Loading...</div>checks for false, which is opposite of loading.Final Answer:
<div *ngIf="isLoading()">Loading...</div> -> Option AQuick Check:
Call signals with () in *ngIf [OK]
- Using signal name without ()
- Trying to assign inside *ngIf
- Checking wrong boolean condition
<div *ngIf="error()" role="alert">Error: {{ error() }}</div>
<div *ngIf="isLoading()">Loading...</div>
<div *ngIf="!isLoading() && !error()">Data loaded</div>What will be displayed if
isLoading() returns false and error() returns "Network error"?Solution
Step 1: Evaluate conditions with given values
isLoading() is false, error() is "Network error" (truthy).Step 2: Check which *ngIf blocks show
The first div shows if error() is truthy, so it displays "Error: Network error". The second div shows if isLoading() is true (false here), so no. The third div shows if not loading and no error, but error exists, so no.Final Answer:
Error: Network error -> Option BQuick Check:
Error present = show error message [OK]
- Ignoring error() and showing loading
- Showing data loaded despite error
- Assuming nothing shows when error exists
export class DataComponent {
isLoading = signal(false);
error = signal(null);
fetchData() {
this.isLoading = true;
fetch('/api/data')
.then(() => this.isLoading = false)
.catch(err => this.error = err.message);
}
}Solution
Step 1: Understand how to update signals
Signals are objects with a method to update their value, not variables to reassign.Step 2: Check code for signal updates
The code doesthis.isLoading = truewhich reassigns the signal variable instead of callingthis.isLoading.set(true). Same for error.Final Answer:
Signals are reassigned instead of updating their value -> Option CQuick Check:
Update signals with .set(), not reassignment [OK]
- Assigning signals directly instead of using .set()
- Forgetting to reset error before fetch
- Assuming async needed without await
isLoading(), error(), and data()?Solution
Step 1: Understand state priorities
Loading state should show spinner first, then error if exists, then data if no loading or error.Step 2: Analyze each template option
<div *ngIf="isLoading()">Loading spinner...</div> <div *ngIf="error()" role="alert">Error: {{ error() }}</div> <div *ngIf="!isLoading() && !error()">{{ data() }}</div>correctly shows loading when isLoading() is true, error message if error() is truthy, and data only if not loading and no error. The other options mix conditions incorrectly or show wrong messages for states.Final Answer:
<pre><div *ngIf="isLoading()">Loading spinner...</div> <div *ngIf="error()" role="alert">Error: {{ error() }}</div> <div *ngIf="!isLoading() && !error()">{{ data() }}</div></pre> -> Option AQuick Check:
Loading > Error > Data display order [OK]
- Showing data while still loading
- Displaying error message incorrectly
- Mixing up *ngIf conditions order
Ready to prove it?
Pass the test and this pattern moves unknown
