Formlara Giriş
Formlar, Angular uygulamalarında kullanıcıların veri girmesini, düzenlemesini ve sunmasını sağlayan temel bileşenlerdir. Angular, form yönetimi için iki ana yaklaşım sunar: Template-driven Forms (Şablon Tabanlı Formlar) ve Reactive Forms (Tepkisel Formlar). Template-driven Forms, basit ve küçük formlar için uygundur ve ngModel ile çift yönlü veri bağlama sağlar. Reactive Forms ise daha büyük ve karmaşık formlarda güçlü bir kontrol ve validasyon mekanizması sunar.
Angular’da formları doğru kullanmak, veri akışını yönetmek, bileşenlerin durumunu takip etmek ve lifecycle yönetimi yapmak için kritik öneme sahiptir. Formlar ayrıca kullanıcı etkileşimlerini kontrol etmenizi, hataları yakalamanızı ve uygulamanın veri bütünlüğünü korumanızı sağlar.
Bu bölümde, temel form oluşturmayı, form verilerini takip etmeyi, validasyon uygulamayı ve gönderim işlemlerini öğreneceksiniz. Ayrıca form verilerini farklı bileşenler arasında paylaşmayı ve modern SPA mimarisi içerisinde formların nasıl yönetildiğini göreceksiniz. Öğrenciler, Angular’ın veri akışı ve bileşen yaşam döngüsü ile form yönetimini bütünleştirmeyi deneyimleyecekler.
Temel Örnek
typescriptimport { Component } from '@angular/core';
import { FormsModule } from '@angular/forms';
@Component({
selector: 'app-temel-form',
standalone: true,
imports: [FormsModule],
template: ` <h2>Temel Form</h2>
<form (ngSubmit)="gonder()"> <label>İsim:</label>
<input type="text" [(ngModel)]="kullanici.isim" name="isim" required>
<label>Email:</label>
<input type="email" [(ngModel)]="kullanici.email" name="email" required>
<button type="submit">Gönder</button>
</form>
<p *ngIf="gonderildi">Gönderilen Veri: {{ kullanici | json }}</p>
`
})
export class TemelFormComponent {
kullanici = { isim: '', email: '' };
gonderildi = false;
gonder() {
this.gonderildi = true;
}
}
Bu örnekte FormsModule kullanılarak ngModel ile çift yönlü veri bağlama sağlanmıştır. kullanici
nesnesi formun durumunu temsil ederken, gonderildi
formun gönderilip gönderilmediğini takip eder.
[(ngModel)]
direktifi, input alanı ile bileşen içindeki model arasında anlık veri senkronizasyonu sağlar. (ngSubmit)
ise form gönderildiğinde gonder()
metodunu çağırarak veri işlemlerini yönetir. Bu yapı, form yönetimi, durum kontrolü ve veri akışı konularını basit bir şekilde göstermektedir. Ayrıca prop drilling ve gereksiz re-render problemlerinden kaçınmaya yardımcı olur.
Pratik Örnek
typescriptimport { Component } from '@angular/core';
import { ReactiveFormsModule, FormGroup, FormControl, Validators } from '@angular/forms';
@Component({
selector: 'app-pratik-form',
standalone: true,
imports: [ReactiveFormsModule],
template: ` <h2>Reactive Form Örneği</h2>
<form [formGroup]="form" (ngSubmit)="gonder()"> <label>Kullanıcı Adı:</label> <input type="text" formControlName="kullaniciAdi">
<div *ngIf="form.get('kullaniciAdi')?.invalid && form.get('kullaniciAdi')?.touched">
Kullanıcı adı zorunludur. </div>
<label>Şifre:</label>
<input type="password" formControlName="sifre">
<div *ngIf="form.get('sifre')?.invalid && form.get('sifre')?.touched">
Şifre en az 6 karakter olmalıdır.
</div>
<button type="submit" [disabled]="form.invalid">Kaydet</button>
</form>
<p *ngIf="gonderildi">Form Verisi: {{ form.value | json }}</p>
`
})
export class PratikFormComponent {
form = new FormGroup({
kullaniciAdi: new FormControl('', Validators.required),
sifre: new FormControl('', [Validators.required, Validators.minLength(6)])
});
gonderildi = false;
gonder() {
this.gonderildi = true;
}
}
Advanced Angular Implementation
typescriptimport { Component, OnInit, OnDestroy } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Subscription } from 'rxjs';
@Component({
selector: 'app-ileri-form',
template: ` <h2>İleri Düzey Form</h2>
<form [formGroup]="profilForm" (ngSubmit)="gonder()"> <label>Ad Soyad:</label> <input formControlName="adSoyad">
<label>Yaş:</label>
<input type="number" formControlName="yas">
<label>Email:</label>
<input type="email" formControlName="email">
<button type="submit" [disabled]="profilForm.invalid">Kaydet</button>
</form>
`
})
export class IleriFormComponent implements OnInit, OnDestroy {
profilForm!: FormGroup;
sub!: Subscription;
constructor(private fb: FormBuilder) {}
ngOnInit() {
this.profilForm = this.fb.group({
adSoyad: ['', Validators.required],
yas: [null, [Validators.required, Validators.min(18)]],
email: ['', [Validators.required, Validators.email]]
});
this.sub = this.profilForm.valueChanges.subscribe(val => console.log('Değişiklik:', val));
}
gonder() {
if (this.profilForm.valid) {
console.log('Kaydedilen Veri:', this.profilForm.value);
}
}
ngOnDestroy() {
this.sub.unsubscribe();
}
}
Angular’da formlar için en iyi uygulamalar, bileşen mantığı ile form durumunu ayrı tutmak, state mutasyonlarından kaçınmak ve veri akışını optimize etmektir. Reactive Forms, karmaşık validasyon ve lifecycle yönetimi için daha uygundur.
Yaygın hatalar arasında prop drilling, gereksiz render işlemleri ve form durumunu doğrudan değiştirmek vardır. Performans optimizasyonu için OnPush change detection stratejisi kullanılabilir. Form verilerinin güvenliği için hem client hem de server taraflı validasyon önemlidir.
📊 Kapsamlı Referans
Angular Element/Method | Description | Syntax | Example | Notes |
---|---|---|---|---|
FormGroup | Kontrol grubu oluşturur | new FormGroup({...}) | new FormGroup({isim: new FormControl('')}) | Reactive Forms yönetimi |
FormControl | Bireysel kontrol | new FormControl(val, Validators) | new FormControl('', Validators.required) | Input alanları için |
ngModel | Çift yönlü veri bağlama | [(ngModel)]="val" | <input [(ngModel)]="kullanici.isim"> | Template-driven Forms |
Validators.required | Zorunlu alan validasyonu | Validators.required | new FormControl('', Validators.required) | Form validasyonu |
Validators.email | Email validasyonu | Validators.email | new FormControl('', Validators.email) | Email alanları |
formGroup | FormGroup bağlama | [formGroup]="form" | <form [formGroup]="form"> | Reactive Forms |
formControlName | Kontrol adını atar | formControlName="kontrol" | <input formControlName="email"> | Reactive Forms |
ngSubmit | Form gönderim olayı | (ngSubmit)="metod()" | <form (ngSubmit)="gonder()"> | Form submit |
FormBuilder | Form kolay oluşturucu | this.fb.group({...}) | this.fb.group({isim: ['']}) | Reactive Forms |
valueChanges | Değer değişimlerini dinler | control.valueChanges.subscribe() | this.form.valueChanges.subscribe(console.log) | Reactive Forms |
📊 Complete Angular Properties Reference
Property | Values | Default | Description | Angular Support |
---|---|---|---|---|
updateOn | 'change','blur','submit' | 'change' | Kontrolün güncellenme zamanı | v14+ |
disabled | true,false | false | Kontrolü devre dışı bırakır | v2+ |
value | any | '' | Kontrolün değeri | v2+ |
valid | boolean | false | Kontrolün geçerli olup olmadığını gösterir | v2+ |
invalid | boolean | false | Kontrolün geçersiz olup olmadığını gösterir | v2+ |
touched | boolean | false | Kullanıcı tarafından dokunuldu mu | v2+ |
dirty | boolean | false | Değer değişti mi | v2+ |
pristine | boolean | true | Değer değiştirilmedi mi | v2+ |
pending | boolean | false | Asenkron validasyon devam ediyor mu | v4+ |
errors | object | null | Validasyon hataları | v2+ |
status | 'VALID','INVALID','PENDING','DISABLED' | 'VALID' | Kontrol durumu | v2+ |
path | string[] | [] | Form içindeki yol | v2+ |
Formlara giriş, Angular’da kullanıcı etkileşimini yönetmenin temel yoludur. Formlar sayesinde veri yönetimi, validasyon ve bileşenler arası veri paylaşımı sağlanabilir. Öğrenciler, temel ve ileri düzey örneklerle form oluşturma, validasyon ve veri akışı yönetimini öğrenirler.
Bir sonraki adım olarak Reactive Forms ileri düzey konuları, dinamik form oluşturma ve özel validasyonlar üzerinde çalışmak önerilir. Ayrıca bileşenler arası veri paylaşımı ve performans optimizasyonu konuları ile formların profesyonel uygulamalara entegrasyonu öğrenilebilir.
🧠 Bilginizi Test Edin
Bilginizi Test Edin
Bu interaktif sınavla kendini test et ve konuyu ne kadar iyi anladığını gör
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek