Komponen adalah satu potong tampilan yang punya HTML, data, dan perilakunya sendiri, dibungkus jadi satu tag baru. Halaman Angular disusun dari komponen-komponen seperti ini. Bayangin cetakan martabak mini di gerobak Bang Jali. Cetakannya cuma satu, tapi sekali tuang bisa jadi banyak martabak, dan tiap martabak bisa dikasih topping sendiri tanpa mengubah yang lain. Di Angular, class komponen adalah cetakannya, dan tiap tag <app-menu-item> di template adalah satu martabak yang dicetak darinya. Satu hasil cetakan itu disebut instance.
🧪 Tebakan cepat: Template
Appmenulis<app-menu-item />tiga kali, tapi lupa menambahkanimports: [MenuItem]. Berapa kartu menu yang tampil: tiga, satu, atau nol? Jawabannya ada di bagian "Memakai komponen di komponen lain".
Tiga bagian sebuah komponen
// src/app/menu-item/menu-item.ts
import { Component } from '@angular/core'
@Component({
selector: 'app-menu-item',
standalone: true,
template: `
<div class="kartu">
<h3>{{ nama }}</h3>
<p>Rp{{ harga }}</p>
</div>
`,
styles: `.kartu { border: 1px solid #ddd; border-radius: 8px; padding: 8px; }`,
})
export class MenuItem {
nama = 'Martabak Telur Spesial'
harga = 50000
}
- Class (
export class MenuItem) menyimpan data dan perilaku. Di sini datanyanamadanharga. - Template adalah HTML-nya.
{{ nama }}menampilkan isi propertinamadari class; caranya dibahas lengkap di pelajaran berikutnya. - Metadata adalah objek di dalam
@Component({...}):selector: nama tag untuk memakai komponen ini,<app-menu-item>. Biasanya diawaliapp-dan memakai tanda hubung, supaya gak bentrok dengan tag HTML bawaan.template(HTML ditulis langsung) atautemplateUrl: './menu-item.html'(HTML di file terpisah, bawaan proyek dari CLI).stylesataustyleUrl: CSS yang cuma berlaku di dalam komponen ini..kartudi sini gak mengenai elemen di komponen lain.standalonedanimports: dibahas di bawah.
Memakai komponen di komponen lain
// src/app/app.ts
import { Component } from '@angular/core'
import { MenuItem } from './menu-item/menu-item'
@Component({
selector: 'app-root',
standalone: true,
imports: [MenuItem],
template: `
<h1>Martabak Bang Jali</h1>
<app-menu-item />
<app-menu-item />
<app-menu-item />
`,
})
export class App {}
import { MenuItem } from ...di baris atas adalah import TypeScript biasa: class-nya bisa dipakai di file ini.imports: [MenuItem]di dalam@Componentmemberi tahu template App bahwa tag<app-menu-item>itu komponen MenuItem. Dua-duanya perlu.- Tiga tag berarti tiga instance: Angular membuat tiga objek
MenuItemyang terpisah. Mengubah data di satu kartu gak mengubah dua yang lain. - Untuk sekarang ketiga kartunya sama, karena
namaditulis tetap di class. Memberi tiap kartu nama sendiri dibahas di pelajaran Input dan Output.
| Di template App | Yang dibuat Angular | Tampil |
|---|---|---|
<h1> |
elemen biasa | Martabak Bang Jali |
<app-menu-item /> ke-1 |
instance MenuItem #1 | kartu Martabak Telur Spesial, Rp50000 |
<app-menu-item /> ke-2 |
instance MenuItem #2 | kartu yang sama |
<app-menu-item /> ke-3 |
instance MenuItem #3 | kartu yang sama |
Tanpa imports: [MenuItem], Angular gak tahu <app-menu-item> itu apa. Tag-nya tetap ada di DOM tapi kosong, jadi yang tampil nol kartu. Itu jawaban tebakannya. Di browser, termasuk di editor latihan, console menulis ini sekali untuk tiap tag:
NG0304: 'app-menu-item' is not a known element (used in the 'App' component template):
1. If 'app-menu-item' is an Angular component, then verify that it is included in the '@Component.imports' of this component.
Waktu ng serve atau ng build, kalimat yang mirip muncul sebagai error kompilasi NG8001, dan build-nya berhenti.
Standalone dan NgModule
Dulu komponen gak bisa berdiri sendiri. Tiap komponen harus didaftarkan di sebuah NgModule:
// Gaya lama: wajib di Angular 2 sampai 13, masih ada di banyak proyek lama
@NgModule({
declarations: [App, MenuItem],
imports: [BrowserModule],
bootstrap: [App],
})
export class AppModule {}
- Angular 14 memperkenalkan komponen standalone, Angular 15 menstabilkannya, dan sejak Angular 17
ng newmembuat proyek standalone. - Sejak Angular 19,
standalone: truejadi default, jadi komponen daring generategak menulisnya lagi. Komponen gaya lama yang masih masuk NgModule ditandaistandalone: false. - Editor latihan di sini menjalankan Angular 22, jadi komponen tanpa
standalone: truepun jalan, dan latihannya gak memintamu menulis baris itu. Kamu masih akan sering melihatnya di kode Angular 14 sampai 18.
Membuat komponen dengan CLI
ng generate component navbar # versi pendek: ng g c navbar
Di Angular 20 ke atas, perintah ini membuat folder src/app/navbar/ berisi navbar.ts (class Navbar, selector app-navbar), navbar.html, navbar.css, dan navbar.spec.ts untuk test. Versi sebelumnya menamai filenya navbar.component.ts dan class-nya NavbarComponent. Isinya sama.
⚠️ Jebakan yang sering ketemu
- Lupa
imports. Tag-nya ada tapi kosong, dan console menulis NG0304 (waktu build: NG8001). Import class-nya di atas file, lalu masukkan keimports: [...]. - Menulis nama class sebagai tag. Yang dipakai di template adalah selector,
<app-menu-item />, bukan<MenuItem />. - Menulis
standalone: falsedi komponen utama. Angular berhenti denganNG0907: The AppComponent component is not marked as standalone, but Angular expects to have a standalone component here.Sejak Angular 19, cukup hapus barisnya: komponen sudah standalone secara bawaan. - Teksnya beda sedikit. Latihan mengecek
<h1>persisHyper Sheetsdan<p>persisBelajar Angular itu seru!.
TL;DR: Komponen = class (data dan perilaku) + template (HTML) + metadata di @Component (selector, template atau templateUrl, styles, imports). Selector adalah nama tag-nya, misalnya <app-menu-item />, dan tiap tag membuat satu instance sendiri. Komponen yang dipakai di template komponen lain harus masuk imports: [...] komponen itu; kalau lupa, tag-nya kosong dan muncul NG0304 atau NG8001. ng generate component navbar (pendeknya ng g c navbar) membuat komponen baru. Standalone menggantikan NgModule; sejak Angular 19 itu default, juga di editor latihan (Angular 22), jadi standalone: true gak perlu ditulis lagi.