🅰️

Angular

Google tarafından desteklenen, TypeScript tabanlı, büyük ölçekli ve kurumsal uygulamalar geliştirmek için tasarlanmış kapsamlı bir framework.

📅 2016
👤 Google
📦 22.x
📄 MIT

Temel Özellikler

🛡️

TypeScript-First

Angular tamamen TypeScript ile yazılmıştır. Güçlü tip kontrolü ve gelişmiş IDE desteği sunar.

💉

Dependency Injection

Gelişmiş bir DI sistemine sahiptir. Servislerin ve bileşenlerin test edilebilirliğini ve modülerliğini artırır.

🌊

RxJS & Observables

Asenkron işlemleri yönetmek için reaktif programlama yaklaşımını ve RxJS kütüphanesini kullanır.

🧱

Modular Architecture

NgModules ile uygulamayı mantıksal modüllere ayırarak lazy loading gibi performans avantajları sağlar.

🛠️

Angular CLI

Güçlü komut satırı aracı (CLI) ile proje oluşturma, test etme, derleme ve kod üretimi işlemlerini kolaylaştırır.

🔄

Two-way Binding

[(ngModel)] direktifi sayesinde görünüm (UI) ile veri modeli arasında çift yönlü veri bağlamayı destekler.

Avantajlar ve Dezavantajlar

👍 Avantajlar

  • Full-featured framework (Yönlendirme, HTTP, Formlar vb. dahil)
  • TypeScript zorunluluğu ile daha güvenli kod yapısı
  • Google tarafından desteklenmesi ve uzun vadeli güvence
  • Büyük ölçekli kurumsal projeler için mükemmel uygunluk
  • Güçlü CLI aracı ile standartlaşmış yapı
  • Güçlü topluluk ve mimari standartlar

👎 Dezavantajlar

  • Yeni başlayanlar için öğrenme eğrisi çok yüksektir
  • Daha fazla boilerplate koda (verbose) sahip olabilir
  • Başlangıçta büyük bundle boyutları (gerçi güncel sürümlerde iyileştirildi)
  • RxJS, Zones ve DI gibi kavramların karmaşıklığı
  • Küçük ve basit projeler için gereğinden fazla detaylı olabilir

Canlı Örnekler (Simülasyon)

Not: Angular, çalışması için TypeScript derlemesi gerektirir. Bu sayfadaki canlı örnekler, Angular konseptlerini görselleştirmek için Vanilla JS ile oluşturulmuş simülasyonlardır.

1. Template Syntax ve Data Binding

Angular'ın güçlü şablon (template) yeteneklerini gösteren örnek. Interpolation {{ }}, Property Binding [prop] ve Event Binding (event) içerir.

Kullanıcı Bilgileri

Merhaba, Ziyaretçi!

import { Component } from '@angular/core';

@Component({
  selector: 'app-user-profile',
  template: `
    <div class="card">
      <h4>Kullanıcı Bilgileri</h4>
      
      <!-- Interpolation -->
      <p>Merhaba, <strong>{{ userName }}</strong>!</p>
      
      <!-- Two-way Data Binding -->
      <input [(ngModel)]="userName" placeholder="Adınız" />
      
      <!-- Event Binding ve Property Binding -->
      <button (click)="toggleStatus()" [class.active]="isActive">
        {{ isActive ? 'Aktif' : 'Pasif' }} (Durumu Değiştir)
      </button>
    </div>
  `
})
export class UserProfileComponent {
  userName: string = 'Ziyaretçi';
  isActive: boolean = false;

  toggleStatus() {
    this.isActive = !this.isActive;
  }
}

2. Dependency Injection (DI) Simülasyonu

Servislerin bileşenlere nasıl enjekte edildiğini gösteren bir örnek. DI sayesinde modüller arası bağımlılık azalır.

LoggerService

Uygulama çapında loglama yapar.

Log Çıktısı (Konsol)

import { Injectable, Component } from '@angular/core';

// 1. Servis Tanımı
@Injectable({
  providedIn: 'root'
})
export class LoggerService {
  log(msg: string) {
    console.log(new Date().toLocaleTimeString() + ': ' + msg);
  }
}

// 2. Servisi Kullanan Bileşen
@Component({
  selector: 'app-component-a',
  template: `<button (click)="doAction()">Bileşen A'dan Log</button>`
})
export class ComponentA {
  // Dependency Injection (DI) ile servis enjekte ediliyor
  constructor(private logger: LoggerService) {}

  doAction() {
    this.logger.log('Bileşen A çalıştı.');
  }
}

3. Component Lifecycle Hooks

Bileşenlerin yaşam döngüsü hook'larını inceleyin. Aşağıdaki aşamalara tıklayarak açıklamalarını görün.

ngOnChanges
ngOnInit
ngDoCheck
ngAfterContentInit
ngAfterViewInit
ngOnDestroy
Bileşen ilk kez oluşturulduktan sonra bir kez çalışır. Genellikle veri çekme (HTTP istekleri) işlemleri burada yapılır.
import { Component, OnInit, OnDestroy, OnChanges, SimpleChanges, Input } from '@angular/core';
import { Subscription } from 'rxjs';

@Component({
  selector: 'app-lifecycle',
  template: `<p>Sayaç: {{ count }}</p>`
})
export class LifecycleComponent implements OnInit, OnChanges, OnDestroy {
  @Input() count: number;
  private timerSub: Subscription;

  ngOnChanges(changes: SimpleChanges) {
    console.log('Count değişti:', changes.count.currentValue);
  }

  ngOnInit() {
    console.log('Bileşen başlatıldı.');
    // Veri çekme veya abonelik başlatma
  }

  ngOnDestroy() {
    console.log('Bileşen yok ediliyor.');
    // Aboneliği sonlandır (Memory leak önlemek için)
    if (this.timerSub) {
      this.timerSub.unsubscribe();
    }
  }
}

4. Pipes (Veri Dönüştürme)

Angular Pipes, şablon içinde veriyi formatlamak için kullanılır. Vanilla JS ile simüle edilmiştir.

Uppercase Pipe:
ANGULAR PIPES HARİKA!
Titlecase Pipe:
Angular Pipes Harika!
Currency Pipe:
$1,250.50
import { Component } from '@angular/core';

@Component({
  selector: 'app-pipes-demo',
  template: `
    <div>
      <h4>Orijinal Metin: {{ text }}</h4>
      
      <!-- Metin dönüştürme pipes -->
      <p>Uppercase: {{ text | uppercase }}</p>
      <p>Titlecase: {{ text | titlecase }}</p>
      
      <!-- Sayı formatlama pipes -->
      <p>Para Birimi: {{ amount | currency:'USD' }}</p>
      <p>Tarih: {{ today | date:'dd.MM.yyyy' }}</p>
    </div>
  `
})
export class PipesDemoComponent {
  text: string = 'angular pipes harika!';
  amount: number = 1250.5;
  today: Date = new Date();
}

Kullanım Senaryoları