On this page
Routing
The Angular Router maps URLs to components, enabling multi-view single-page applications without full page reloads.
Basic Route Configuration
src/app/app.routes.ts:
import { Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';
export const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'about', component: AboutComponent },
{ path: '**', redirectTo: '' } // Wildcard — unknown URLs
];
Register routes in app.config.ts:
import { provideRouter } from '@angular/router';
import { routes } from './app.routes';
export const appConfig: ApplicationConfig = {
providers: [provideRouter(routes)]
};
Display routed components in the root template:
<!-- app.component.html -->
<nav>
<a routerLink="/">Home</a>
<a routerLink="/about">About</a>
</nav>
<router-outlet></router-outlet>
Import RouterLink and RouterOutlet in standalone root components.
Programmatic Navigation
import { Component, inject } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-login',
standalone: true,
template: `<button (click)="goToDashboard()">Enter</button>`
})
export class LoginComponent {
private router = inject(Router);
goToDashboard() {
this.router.navigate(['/dashboard']);
}
}
Route Parameters
export const routes: Routes = [
{ path: 'users/:id', component: UserDetailComponent }
];
Read the parameter in the component:
import { Component, inject } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-user-detail',
standalone: true,
template: `<h1>User {{ userId }}</h1>`
})
export class UserDetailComponent {
private route = inject(ActivatedRoute);
userId = this.route.snapshot.paramMap.get('id');
}
Link with parameters:
<a [routerLink]="['/users', user.id]">{{ user.name }}</a>
Lazy Loading and Guards
Load features on demand and protect routes:
export const routes: Routes = [
{
path: 'admin',
loadComponent: () =>
import('./admin/admin.component').then(m => m.AdminComponent),
canActivate: [authGuard]
}
];
export const authGuard: CanActivateFn = () => {
const router = inject(Router);
return !!localStorage.getItem('token') || router.createUrlTree(['/login']);
};
Add CanActivateFn and Router imports at the top of the routes file.
Routing keeps your app organized — each URL maps to a focused component with clear navigation patterns.