CPCODELAB
Angular

Routing and RouterOutlet

12 min read

Client-Side Routing in Angular

Angular's @angular/router enables single-page application routing — navigating between views without a full page reload. You define a route configuration array mapping URL paths to components, then use <router-outlet> as the placeholder where the matched component renders.

ts
// app.routes.ts
import { Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';
import { UserDetailComponent } from './users/user-detail.component';
import { NotFoundComponent } from './not-found.component';

export const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'about', component: AboutComponent },
  { path: 'users/:id', component: UserDetailComponent },
  // Lazy-load a feature module
  {
    path: 'dashboard',
    loadComponent: () =>
      import('./dashboard/dashboard.component').then(m => m.DashboardComponent)
  },
  { path: '**', component: NotFoundComponent }
];
ts
// main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { provideRouter } from '@angular/router';
import { AppComponent } from './app/app.component';
import { routes } from './app/app.routes';

bootstrapApplication(AppComponent, {
  providers: [provideRouter(routes)]
});

Using RouterOutlet and RouterLink

ts
import { Component } from '@angular/core';
import { RouterOutlet, RouterLink, RouterLinkActive } from '@angular/router';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [RouterOutlet, RouterLink, RouterLinkActive],
  template: `
    <nav>
      <a routerLink="/" routerLinkActive="active" [routerLinkActiveOptions]="{exact:true}">Home</a>
      <a routerLink="/about" routerLinkActive="active">About</a>
      <a routerLink="/dashboard" routerLinkActive="active">Dashboard</a>
    </nav>
    <main>
      <router-outlet />
    </main>
  `
})
export class AppComponent {}

Use loadComponent (for standalone) or loadChildren (for feature routes) to implement lazy loading. This splits your bundle so users only download the code for routes they visit, dramatically improving initial load time.

Reading Route Parameters

ts
import { Component, OnInit, inject } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

@Component({
  selector: 'app-user-detail',
  standalone: true,
  template: `<p>User ID: {{ userId }}</p>`
})
export class UserDetailComponent implements OnInit {
  private route = inject(ActivatedRoute);
  userId = '';

  ngOnInit() {
    this.userId = this.route.snapshot.paramMap.get('id') ?? '';
  }
}
Ready to test yourself?
Practice Angular— quiz & coding exercises