Router membuat satu aplikasi Angular punya beberapa halaman, masing-masing dengan alamatnya sendiri (/menu, /pesanan), dan berpindah di antaranya tanpa memuat ulang halaman. Bayangin warung Martabak Bang Jali punya ruang Menu dan ruang Pesanan. Penerima tamu memegang daftar "alamat ini, ruang yang itu" (routes), dan cuma ada satu meja tempat isi ruangnya disajikan (<router-outlet>). Pindah lewat pintu dalam (routerLink) itu cepat dan barang bawaanmu tetap di tangan. Keluar lewat pintu depan lalu masuk lagi (<a href>) berarti semuanya mulai dari awal.
🧪 Tebakan cepat: Keranjang dari pelajaran Services sudah berisi 2 martabak. Kamu klik
<a href="/pesanan">Pesanan</a>, bukanrouterLink. Halaman Pesanan menampilkan berapa item? Jawabannya ada di bagian "routerLink vs href".
Daftar rute: alamat ke komponen
// src/app/app.routes.ts
import { Routes } from '@angular/router'
import { MenuPage } from './menu/menu'
import { PesananPage } from './pesanan/pesanan'
import { TidakDitemukan } from './tidak-ditemukan/tidak-ditemukan'
export const routes: Routes = [
{ path: '', redirectTo: 'menu', pathMatch: 'full' },
{ path: 'menu', component: MenuPage },
{ path: 'pesanan', component: PesananPage },
{ path: '**', component: TidakDitemukan },
]
// src/app/app.config.ts
import { ApplicationConfig } from '@angular/core'
import { provideHttpClient } from '@angular/common/http'
import { provideRouter } from '@angular/router'
import { routes } from './app.routes'
export const appConfig: ApplicationConfig = {
providers: [provideRouter(routes), provideHttpClient()],
}
| Alamat | Yang tampil |
|---|---|
/ |
dialihkan ke /menu, jadi MenuPage |
/menu |
MenuPage |
/pesanan |
PesananPage |
/promo |
TidakDitemukan |
- Tiap rute memasangkan
path(tanpa garis miring di depan) dengancomponent. TipenyaRoutes, dari@angular/router. provideRouter(routes)memasang router dengan daftar itu, di sebelahprovideHttpClient()dari pelajaran sebelumnya.- Router membaca daftarnya dari atas, dan rute pertama yang cocok yang dipakai.
router-outlet: tempat halamannya muncul
// src/app/app.ts
import { Component } from '@angular/core'
import { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router'
@Component({
selector: 'app-root',
standalone: true,
imports: [RouterLink, RouterLinkActive, RouterOutlet],
template: `
<h1>Martabak Bang Jali</h1>
<nav>
<a routerLink="/menu" routerLinkActive="aktif">Menu</a>
<a routerLink="/pesanan" routerLinkActive="aktif">Pesanan</a>
</nav>
<router-outlet />
`,
})
export class App {}
<router-outlet />adalah tempat komponen rute yang cocok dipasang. Judul dan<nav>tetap di tempatnya; cuma isi outlet yang berganti. Pindah dari/menuke/pesananmenghancurkan MenuPage dan membuat PesananPage.routerLink="/pesanan"pindah ke alamat itu tanpa memuat ulang halaman.routerLinkActive="aktif"menambahkan classaktifke tautan yang alamatnya sedang dibuka. Untuk tautan ke/, tambahkan[routerLinkActiveOptions]="{ exact: true }"; tanpa itu,/dianggap aktif di semua halaman.- Ketiganya harus ada di
imports. TanpaRouterLink, tautannya gak punyahrefdan diklik gak terjadi apa-apa. TanpaRouterOutlet, console menulisNG0304: 'router-outlet' is not a known element.
Latihan pertama memakai bentuk yang sama: <nav> berisi <a routerLink="/">Home</a> dan <a routerLink="/about">About</a>, lalu <router-outlet />. Latihan kedua menulis daftarnya: export const routes: Routes = [...] dengan '' ke HomeComponent, 'about' ke AboutComponent, dan '**' ke NotFoundComponent.
routerLink vs href
routerLink="/pesanan" |
<a href="/pesanan"> |
|
|---|---|---|
| Halamannya | gak dimuat ulang | dimuat ulang dari server |
| JavaScript aplikasi | tetap jalan | diunduh dan dijalankan lagi dari nol |
KeranjangService |
instance yang sama, isinya tetap | dibuat lagi, kosong |
| Pesanan menampilkan | Keranjang: 2 item | Keranjang: 0 item |
href membuat browser meninggalkan aplikasi dan memintanya lagi ke server. Semua service dibuat ulang, jadi keranjangnya kosong: Pesanan menampilkan 0 item. Itu jawaban tebakannya. Pakai routerLink untuk halaman di dalam aplikasi, dan href untuk alamat di luar aplikasi (Instagram Bang Jali, file PDF menu).
Rute kosong, pathMatch, dan wildcard
{ path: '', redirectTo: 'menu', pathMatch: 'full' }mengalihkan alamat yang benar-benar kosong ke/menu. TanpapathMatch, Angular 18 dalam mode development (ng serve) menolak seluruh daftarnya begitu router dibuat, dan aplikasinya berhenti di tengah: cuma judul sebelum<nav>yang tampil, dan console menulisNG04014: Invalid configuration of route '{path: "", redirectTo: "menu"}': please provide 'pathMatch'. The default value of 'pathMatch' is 'prefix', but often the intent is to use 'full'.'**'cocok dengan alamat apa pun, jadi taruh paling bawah. Di urutan pertama, dia menangkap/menudan/pesananjuga, dan semua halaman jadi TidakDitemukan.- Tanpa
'**', alamat yang gak ada di daftar membuat navigasinya gagal: halamannya gak pindah, dan console menulisNG04002: Cannot match any routes. URL Segment: 'promo'. path: '/menu'(pakai garis miring) juga ditolak:NG04014: Invalid configuration of route '/menu': path cannot start with a slash.
Pindah halaman dari kode
Sesudah pesanan terkirim, pindah ke /pesanan tanpa menunggu klik:
private router = inject(Router)
kirim() {
this.router.navigate(['/pesanan'])
}
navigate(['/pesanan']) dan navigateByUrl('/pesanan') sama-sama pindah tanpa memuat ulang, persis seperti routerLink.
⚠️ Jebakan yang sering ketemu
hrefuntuk halaman sendiri. Aplikasinya dimuat ulang dan semua isi service hilang. PakairouterLink.- Lupa
imports.RouterLink,RouterLinkActive, danRouterOutletharus ada diimportskomponen yang memakainya. '**'bukan di urutan terakhir, atau rute kosong denganredirectTotanpapathMatch: 'full'.- Detail latihan. Latihan pertama belum punya daftar rute, jadi kalau tautannya diklik di editor, console menulis
NG04002: Cannot match any routes; itu wajar dan gak dinilai. Yang dinilai: ada<nav>, minimal 2<a>di dalamnya denganrouterLink, dan<router-outlet />. Di latihan kedua, tulis tiap rute persis{ path: '', component: HomeComponent }(path lalu component, dengan koma), dan beri daftarnya tipe: Routes. Ketiga komponennya sudah ada di starter, bersamaAppComponentyang punya tiga link dan<router-outlet />. Export daftarnya, lalu penilai membuka/, mengklikAbout, dan mengklikLink rusak(/hilang), dan membaca<h2>yang tampil.
TL;DR: Router memetakan alamat ke komponen lewat Routes ({ path: 'menu', component: MenuPage }) yang dipasang dengan provideRouter(routes), dan komponen yang cocok muncul di <router-outlet />. routerLink="/pesanan" berpindah tanpa memuat ulang, jadi isi service seperti keranjang tetap ada; <a href> memuat ulang seluruh aplikasi dan semuanya mulai dari nol. routerLinkActive menandai tautan yang aktif. Rute kosong yang dialihkan butuh pathMatch: 'full', '**' ditaruh paling bawah untuk halaman 404, dan router.navigate(['/pesanan']) pindah halaman dari kode.