{"id":30703,"date":"2025-10-01T02:31:40","date_gmt":"2025-09-30T23:31:40","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/"},"modified":"2025-10-01T02:31:40","modified_gmt":"2025-09-30T23:31:40","slug":"angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/","title":{"rendered":"Angular\u2019da RxJS ve Signals: Modern Reaktif Durum Y\u00f6netimi"},"content":{"rendered":"<p><body><\/p>\n<p>Angular uygulamalar\u0131nda durum y\u00f6netimi, performans ve geli\u015ftirici deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. Geleneksel yakla\u015f\u0131mlar\u0131n getirdi\u011fi zorluklara kar\u015f\u0131, RxJS&#8217;in g\u00fc\u00e7l\u00fc reaktif programlama yeteneklerini Angular Signals ile birle\u015ftirmek, daha modern, optimize edilmi\u015f ve sezgisel bir \u00e7\u00f6z\u00fcm sunar. Bu makalede, bu iki teknolojiyi bir araya getirerek uygulaman\u0131z\u0131n reaktivitesini nas\u0131l zirveye ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.<\/p>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131 etkile\u015fimleriyle dolu dinamik ve s\u00fcrekli de\u011fi\u015fen yap\u0131lard\u0131r. Bir kullan\u0131c\u0131n\u0131n e-ticaret sitesinde \u00fcr\u00fcn sepete eklemesinden, bir finans uygulamas\u0131nda ger\u00e7ek zamanl\u0131 verilerin g\u00fcncellenmesine kadar her senaryo, uygulaman\u0131n durumunu y\u00f6netme ihtiyac\u0131n\u0131 do\u011furur. Angular gibi \u00e7er\u00e7eveler, bu durumu y\u00f6netmek i\u00e7in \u00e7e\u015fitli ara\u00e7lar sunsa da, b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda kar\u015f\u0131la\u015f\u0131lan ortak zorluklar vard\u0131r.<\/p>\n<p>\u00d6ncelikle, uygulaman\u0131n farkl\u0131 bile\u015fenleri aras\u0131nda veri payla\u015f\u0131m\u0131 ve senkronizasyonu genellikle karma\u015f\u0131k hale gelebilir. Bir bile\u015fenin durumu de\u011fi\u015fti\u011finde, bu de\u011fi\u015fimin ilgili di\u011fer t\u00fcm bile\u015fenlere etkili bir \u015fekilde yay\u0131lmas\u0131 gerekir. Geleneksel olarak, bu durum Subject&#8217;ler, EventEmitter&#8217;lar veya servisler arac\u0131l\u0131\u011f\u0131yla y\u00f6netilse de, zamanla kod taban\u0131 b\u00fcy\u00fcd\u00fck\u00e7e bu ak\u0131\u015flar\u0131 takip etmek ve hata ay\u0131klamak zorla\u015fabilir. \u0130kincisi, performans endi\u015feleri. \u00d6zellikle Angular&#8217;\u0131n Zone.js tabanl\u0131 de\u011fi\u015fim tespit mekanizmas\u0131, uygulaman\u0131n her yerindeki olas\u0131 de\u011fi\u015fiklikleri kontrol etmek i\u00e7in kaynak t\u00fcketebilir. Bu durum, \u00f6zellikle s\u0131k g\u00fcncellenen verilerin veya b\u00fcy\u00fck veri setlerinin oldu\u011fu senaryolarda gereksiz yeniden render i\u015flemlerine yol a\u00e7arak performans d\u00fc\u015f\u00fc\u015f\u00fcne neden olabilir. \u00dc\u00e7\u00fcnc\u00fcs\u00fc, geli\u015ftirici deneyimi. Karma\u015f\u0131k durum y\u00f6netimi ak\u0131\u015flar\u0131, kodun okunabilirli\u011fini azaltabilir ve yeni geli\u015ftiricilerin projeye adaptasyonunu zorla\u015ft\u0131rabilir.<\/p>\n<p>Bu ba\u011flamda, Angular ekibi, reaktif durum y\u00f6netimini daha verimli ve sezgisel hale getirmek i\u00e7in &#8220;Signals&#8221; kavram\u0131n\u0131 tan\u0131tt\u0131. Signals, uygulamadaki veri de\u011fi\u015fikliklerini daha granular (daha k\u00fc\u00e7\u00fck par\u00e7ac\u0131kl\u0131) bir \u015fekilde takip etme ve sadece ilgili bile\u015fenleri g\u00fcncelleme yetene\u011fi sunar. Bu, Zone.js&#8217;in y\u00fck\u00fcn\u00fc azaltarak veya tamamen ortadan kald\u0131rarak performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. Ancak Signals, tek ba\u015f\u0131na t\u00fcm durum y\u00f6netimi ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamaz. \u00d6zellikle asenkron veri ak\u0131\u015flar\u0131n\u0131, karma\u015f\u0131k transformasyonlar\u0131 ve hata y\u00f6netimini ele almak i\u00e7in RxJS&#8217;in g\u00fc\u00e7l\u00fc operat\u00f6r setine hala ihtiyac\u0131m\u0131z var.<\/p>\n<p>Bu makalede, RxJS&#8217;in asenkron veri ak\u0131\u015flar\u0131n\u0131 y\u00f6netme yetene\u011fi ile Angular Signals&#8217;\u0131n granular reaktivite ve performans avantajlar\u0131n\u0131 nas\u0131l birle\u015ftirebilece\u011fimizi derinlemesine inceleyece\u011fiz. Bu modern yakla\u015f\u0131m, hem kodunuzu daha temiz ve y\u00f6netilebilir hale getirecek hem de son kullan\u0131c\u0131ya daha ak\u0131c\u0131 bir deneyim sunacakt\u0131r. \u00d6n\u00fcm\u00fczdeki b\u00f6l\u00fcmlerde, bu iki g\u00fcc\u00fcn senkronize bir \u015fekilde nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, pratik \u00f6rneklerle ve ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Amac\u0131m\u0131z, Angular&#8217;da reaktif programlaman\u0131n gelece\u011fine y\u00f6nelik sa\u011flam bir temel olu\u015fturmak ve bu yenilik\u00e7i teknikleri kendi projelerinize nas\u0131l entegre edece\u011finizi g\u00f6stermektir.<\/p>\n<h2>RxJS ve Signals Temelleri: Modern Angular&#8217;da Veri Ak\u0131\u015flar\u0131 Nas\u0131l Y\u00f6netilir?<\/h2>\n<p>Angular ekosisteminde veri ak\u0131\u015f\u0131n\u0131 ve reaktif programlamay\u0131 anlamak, Signals ve RxJS birlikteli\u011fini kavraman\u0131n anahtar\u0131d\u0131r. Her ikisi de uygulamam\u0131z\u0131n dinamik do\u011fas\u0131n\u0131 y\u00f6netmemize yard\u0131mc\u0131 olsa da, farkl\u0131 sorumluluklara ve kullan\u0131m alanlar\u0131na sahiptirler. Bu b\u00f6l\u00fcmde, her birinin temel prensiplerini ve birbirlerini nas\u0131l tamamlad\u0131klar\u0131n\u0131 detayland\u0131raca\u011f\u0131z.<\/p>\n<h3>RxJS: Asenkron Veri Ak\u0131\u015flar\u0131n\u0131n Orkestrat\u00f6r\u00fc Nedir?<\/h3>\n<p>RxJS (Reactive Extensions for JavaScript), asenkron ve olay tabanl\u0131 programlama i\u00e7in bir k\u00fct\u00fcphanedir. Temelinde &#8220;Observable&#8221; kavram\u0131 yer al\u0131r. Bir Observable, zamanla birden fazla de\u011fer yayabilen bir koleksiyon gibidir. Bu de\u011ferler senkron veya asenkron olabilir. Bir Observable&#8217;a &#8220;subscribe&#8221; (abone) olan bir &#8220;Observer&#8221;, Observable&#8217;dan gelen de\u011ferleri al\u0131r ve \u00fczerinde i\u015flemler yapabilir.<\/p>\n<p>RxJS&#8217;i bu kadar g\u00fc\u00e7l\u00fc yapan \u015fey, zengin operat\u00f6r setidir. Bu operat\u00f6rler sayesinde, Observable&#8217;dan gelen verileri filtreleyebilir, d\u00f6n\u00fc\u015ft\u00fcrebilir, birle\u015ftirebilir veya yan etkileri y\u00f6netebilirsiniz. \u00d6rne\u011fin, bir API \u00e7a\u011fr\u0131s\u0131ndan d\u00f6nen veriyi i\u015flemek, birden fazla kaynaktan gelen veriyi birle\u015ftirmek veya kullan\u0131c\u0131 aray\u00fcz\u00fc olaylar\u0131n\u0131 debouncing ile geciktirmek gibi senaryolarda RxJS vazge\u00e7ilmezdir. \u0130\u015fte s\u0131k\u00e7a kullan\u0131lan baz\u0131 RxJS kavramlar\u0131:<\/p>\n<ul>\n<li><strong>Observable:<\/strong> Zamanla veri yayabilen bir ak\u0131\u015f.<\/li>\n<li><strong>Observer:<\/strong> Observable&#8217;dan gelen verileri t\u00fcketen bir nesne.<\/li>\n<li><strong>Subscription:<\/strong> Bir Observer&#8217;\u0131n bir Observable&#8217;a abone olmas\u0131yla olu\u015fan ili\u015fki. Unsubscribe olmak \u00f6nemlidir.<\/li>\n<li><strong>Operat\u00f6rler:<\/strong> <code>map<\/code>, <code>filter<\/code>, <code>switchMap<\/code>, <code>debounceTime<\/code> gibi veri ak\u0131\u015flar\u0131n\u0131 d\u00f6n\u00fc\u015ft\u00fcren veya kontrol eden fonksiyonlar.<\/li>\n<li><strong>Subject:<\/strong> Hem Observable hem de Observer gibi davranabilen \u00f6zel bir Observable t\u00fcr\u00fc. <code>BehaviorSubject<\/code> ve <code>ReplaySubject<\/code> gibi t\u00fcrevleri mevcuttur.<\/li>\n<\/ul>\n<pre><code class=\"language-typescript\">\nimport { fromEvent, map, debounceTime } from 'rxjs';\n\nconst searchInput = document.getElementById('search-input');\nif (searchInput) {\n  fromEvent(searchInput, 'input')\n    .pipe(\n      map((event: Event) => (event.target as HTMLInputElement).value),\n      debounceTime(300) \/\/ 300ms gecikme ile arama yapar\n    )\n    .subscribe(searchTerm => {\n      console.log('Arama terimi:', searchTerm);\n      \/\/ API \u00e7a\u011fr\u0131s\u0131 yapabilirsiniz\n    });\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, kullan\u0131c\u0131 bir arama kutusuna yazd\u0131\u011f\u0131nda, RxJS <code>fromEvent<\/code> operat\u00f6r\u00fc ile input olaylar\u0131n\u0131 bir Observable'a d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcyor. Daha sonra <code>map<\/code> ile input de\u011ferini al\u0131yor ve <code>debounceTime<\/code> ile h\u0131zl\u0131 yazmalarda gereksiz \u00e7a\u011fr\u0131lar\u0131 engelliyoruz. Bu, RxJS'in asenkron olaylar\u0131 ne kadar zarif bir \u015fekilde y\u00f6netti\u011finin g\u00fczel bir g\u00f6stergesidir.<\/p>\n<h3>Angular Signals: Reaktif Durum De\u011fi\u015fimlerini Gran\u00fcler Olarak Nas\u0131l Y\u00f6netir?<\/h3>\n<p>Angular Signals, Angular 16 ile tan\u0131t\u0131lan ve uygulaman\u0131n reaktivitesini temelden de\u011fi\u015ftiren yeni bir primitiftir. Signals, bir de\u011feri saran ve bu de\u011fer de\u011fi\u015fti\u011finde ilgili t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 otomatik olarak bildiren basit bir de\u011fi\u015fkendir. En b\u00fcy\u00fck avantaj\u0131, uygulaman\u0131n de\u011fi\u015fim tespit mekanizmas\u0131ndan ba\u011f\u0131ms\u0131z olarak \u00e7al\u0131\u015fabilmesi ve yaln\u0131zca de\u011fi\u015fen Signal'e ba\u011fl\u0131 bile\u015fenlerin veya hesaplamalar\u0131n g\u00fcncellenmesini sa\u011flamas\u0131d\u0131r. Bu \"granular reaktivite\", Zone.js'in y\u00fck\u00fcn\u00fc azaltarak veya tamamen ortadan kald\u0131rarak performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<p>Temel Signal t\u00fcrleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong><code>signal()<\/code>:<\/strong> De\u011fi\u015fken bir de\u011feri tutan temel Signal. <code>set()<\/code> veya <code>update()<\/code> metotlar\u0131 ile de\u011feri de\u011fi\u015ftirilir.<\/li>\n<li><strong><code>computed()<\/code>:<\/strong> Bir veya daha fazla Signal'den t\u00fcretilen salt okunur bir Signal. Ba\u011f\u0131ml\u0131 oldu\u011fu Signal'lerden biri de\u011fi\u015fti\u011finde otomatik olarak yeniden hesaplan\u0131r.<\/li>\n<li><strong><code>effect()<\/code>:<\/strong> Bir Signal'in de\u011feri de\u011fi\u015fti\u011finde yan etkileri (konsola yazd\u0131rma, DOM'a eri\u015fme, senkronizasyon vb.) \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<pre><code class=\"language-typescript\">\nimport { signal, computed, effect } from '@angular\/core';\n\nconst count = signal(0);\nconst doubleCount = computed(() => count() * 2);\n\neffect(() => {\n  console.log('Mevcut say\u0131:', count());\n  console.log('\u0130ki kat\u0131:', doubleCount());\n});\n\ncount.set(1); \/\/ Effect \u00e7al\u0131\u015f\u0131r\ncount.update(value => value + 1); \/\/ Effect tekrar \u00e7al\u0131\u015f\u0131r\n\/\/ doubleCount.set(5); \/\/ Hata: Computed signal'lar salt okunurdur.\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>count<\/code> bir Signal olarak tan\u0131mlan\u0131r. <code>doubleCount<\/code>, <code>count<\/code> Signal'inden t\u00fcretilmi\u015f bir <code>computed<\/code> Signal'dir. <code>effect<\/code> ise, <code>count<\/code> veya <code>doubleCount<\/code> de\u011fi\u015fti\u011finde \u00e7al\u0131\u015facak bir yan etkiyi tan\u0131mlar. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, Signals ile reaktif veri ak\u0131\u015f\u0131n\u0131 y\u00f6netmek olduk\u00e7a sezgisel ve do\u011frudan bir hale gelmi\u015ftir.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: RxJS ve Signals aras\u0131ndaki temel fark, RxJS'in \"pull\" (istek \u00fczerine) tabanl\u0131 asenkron ak\u0131\u015flar\u0131 y\u00f6netirken, Signals'\u0131n \"push\" (de\u011fi\u015fimle birlikte otomatik) tabanl\u0131 senkron reaktivite sa\u011flamas\u0131d\u0131r. Bu ikili, birbirini m\u00fckemmel bir \u015fekilde tamamlar.\n    <\/div>\n<p>\u00d6zetle, RxJS, uygulaman\u0131zdaki asenkron olaylar\u0131 ve veri ak\u0131\u015flar\u0131n\u0131 d\u00fczenlemek i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7 seti sunarken, Angular Signals, bu ak\u0131\u015flardan gelen verileri al\u0131p, UI bile\u015fenlerinizin ve di\u011fer hesaplamalar\u0131n\u0131z\u0131n yaln\u0131zca gerekti\u011finde g\u00fcncellenmesini sa\u011flayan, performans odakl\u0131 bir reaktivite primitifidir. Bu ikisinin birle\u015fimi, Angular'da durum y\u00f6netimini hem daha g\u00fc\u00e7l\u00fc hem de daha y\u00f6netilebilir hale getiriyor. Bir sonraki b\u00f6l\u00fcmde, bu kavramlar\u0131 ger\u00e7ek bir senaryo \u00fczerinde nas\u0131l uygulayabilece\u011fimizi g\u00f6rece\u011fiz.<\/p>\n<h2>Pratik Uygulama: RxJS Veri Ak\u0131\u015flar\u0131n\u0131 Signals ile Entegre Etmek Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>\u015eimdiye kadar RxJS ve Signals'\u0131n temel prensiplerini anlad\u0131k. Art\u0131k bu iki g\u00fc\u00e7l\u00fc arac\u0131 ger\u00e7ek bir senaryoda nas\u0131l birle\u015ftirebilece\u011fimizi g\u00f6relim. Genellikle bir uygulamada, bir API'den veri \u00e7ekeriz (RxJS ile) ve bu veriyi kullan\u0131c\u0131 aray\u00fcz\u00fcnde g\u00f6steririz (Signals ile reaktif olarak). Bu b\u00f6l\u00fcm, ad\u0131m ad\u0131m bir \u00fcr\u00fcn listeleme uygulamas\u0131nda bu entegrasyonu nas\u0131l yapaca\u011f\u0131m\u0131z\u0131 a\u00e7\u0131klayacakt\u0131r.<\/p>\n<h3>Senaryo: Dinamik Bir \u00dcr\u00fcn Listesi Uygulamas\u0131 Geli\u015ftirmek<\/h3>\n<p>Bir e-ticaret uygulamas\u0131n\u0131n \u00fcr\u00fcn listeleme sayfas\u0131n\u0131 d\u00fc\u015f\u00fcnelim. Kullan\u0131c\u0131lar \u00fcr\u00fcnleri kategoriye g\u00f6re filtreleyebilir ve listedeki \u00fcr\u00fcn say\u0131s\u0131, filtrelere g\u00f6re dinamik olarak de\u011fi\u015fir. Ayr\u0131ca, \u00fcr\u00fcnler asenkron olarak bir API'den y\u00fcklenmelidir. Bu senaryo, hem RxJS'in asenkron yeteneklerini hem de Signals'\u0131n gran\u00fcler UI reaktivitesini kullanmak i\u00e7in m\u00fckemmel bir f\u0131rsat sunar.<\/p>\n<h4>Ad\u0131m 1: RxJS ile \u00dcr\u00fcn Verilerini Asenkron Olarak \u00c7ekme<\/h4>\n<p>\u0130lk olarak, \u00fcr\u00fcn verilerini \u00e7ekecek bir servis olu\u015ftural\u0131m. Bu servis, bir HTTP iste\u011fi yaparak Observable bir \u00fcr\u00fcn dizisi d\u00f6nd\u00fcrecektir. Hata y\u00f6netimi i\u00e7in de <code>catchError<\/code> operat\u00f6r\u00fcn\u00fc kullanaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ src\/app\/services\/product.service.ts\nimport { Injectable } from '@angular\/core';\nimport { HttpClient } from '@angular\/common\/http';\nimport { Observable, of } from 'rxjs';\nimport { catchError, tap } from 'rxjs\/operators';\n\nexport interface Product {\n  id: number;\n  name: string;\n  category: string;\n  price: number;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ProductService {\n  private productsUrl = 'api\/products'; \/\/ \u00d6rnek bir API endpoint'i\n\n  constructor(private http: HttpClient) {}\n\n  getProducts(): Observable<Product[]> {\n    return this.http.get<Product[]>(this.productsUrl)\n      .pipe(\n        tap(products => console.log('\u00dcr\u00fcnler y\u00fcklendi:', products.length)),\n        catchError(this.handleError<Product[]>('getProducts', []))\n      );\n  }\n\n  private handleError<T>(operation = 'operation', result?: T) {\n    return (error: any): Observable<T> => {\n      console.error(<code>${operation} ba\u015far\u0131s\u0131z oldu:<\/code>, error);\n      \/\/ Uygulaman\u0131n \u00e7al\u0131\u015fmaya devam etmesi i\u00e7in bo\u015f bir sonu\u00e7 d\u00f6nd\u00fcrelim\n      return of(result as T);\n    };\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu servis, <code>HttpClient<\/code> kullanarak \u00fcr\u00fcn verilerini \u00e7eker ve olas\u0131 hatalar\u0131 yakalar. \u015eimdi bu servisi bir bile\u015fende kullanal\u0131m ve \u00e7ekilen verileri bir Signal'e aktaral\u0131m.<\/p>\n<h4>Ad\u0131m 2: \u00c7ekilen Veriyi Bir Signal'e Atama ve Durum Y\u00f6netimi<\/h4>\n<p>\u015eimdi <code>ProductService<\/code>'i kullanan bir bile\u015fen olu\u015ftural\u0131m. Bu bile\u015fen, \u00fcr\u00fcnleri y\u00fckleyecek ve y\u00fcklenen \u00fcr\u00fcnleri bir Signal i\u00e7inde saklayacakt\u0131r. Ayr\u0131ca, y\u00fcklenme durumu ve hata durumu gibi bilgileri de Signal'ler arac\u0131l\u0131\u011f\u0131yla y\u00f6netece\u011fiz.<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ src\/app\/product-list\/product-list.component.ts\nimport { Component, OnInit, inject, signal } from '@angular\/core';\nimport { Product, ProductService } from '..\/services\/product.service';\nimport { toSignal } from '@angular\/core\/rxjs-interop'; \/\/ RxJS'i Signal'e \u00e7evirmek i\u00e7in\n\n@Component({\n  selector: 'app-product-list',\n  standalone: true,\n  template: <code><h2>\u00dcr\u00fcn Listesi<\/h2>\n    <div *ngIf=\"loading()\">\u00dcr\u00fcnler y\u00fckleniyor...<\/div>\n    <div *ngIf=\"error()\" class=\"error\">Hata olu\u015ftu: {{ error() }}<\/div>\n    <ul>\n      <li *ngFor=\"let product of products()\">\n        {{ product.name }} - {{ product.price | currency:&#039;USD&#039;:&#039;symbol&#039;:&#039;1.2-2&#039; }}\n      <\/li>\n    <\/ul><\/code>,\n  styleUrls: ['.\/product-list.component.css']\n})\nexport class ProductListComponent implements OnInit {\n  private productService = inject(ProductService);\n\n  \/\/ \u00dcr\u00fcn listesi i\u00e7in bir Signal\n  products = signal<Product[]>([]);\n  \/\/ Y\u00fcklenme durumu i\u00e7in bir Signal\n  loading = signal(true);\n  \/\/ Hata durumu i\u00e7in bir Signal\n  error = signal<string | null>(null);\n\n  ngOnInit() {\n    this.productService.getProducts().subscribe({\n      next: (data) => {\n        this.products.set(data); \/\/ \u00c7ekilen \u00fcr\u00fcnleri Signal'e set et\n        this.loading.set(false);\n      },\n      error: (err) => {\n        this.error.set('\u00dcr\u00fcnler y\u00fcklenirken bir sorun olu\u015ftu.');\n        this.loading.set(false);\n        console.error('Y\u00fckleme hatas\u0131:', err);\n      }\n    });\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Burada <code>products<\/code>, <code>loading<\/code> ve <code>error<\/code> gibi durumlar\u0131 birer Signal olarak tan\u0131mlad\u0131k. <code>productService.getProducts()<\/code>'dan gelen Observable'a abone oluyor ve gelen veriyi <code>products<\/code> Signal'ine at\u0131yoruz. Bu sayede, \u00fcr\u00fcnler y\u00fcklendi\u011finde veya bir hata olu\u015ftu\u011funda, sadece ilgili Signal'e ba\u011f\u0131ml\u0131 k\u0131s\u0131mlar g\u00fcncellenecektir.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Angular 16+ ile gelen <code>@angular\/core\/rxjs-interop<\/code> paketindeki <code>toSignal()<\/code> fonksiyonu, bir Observable'\u0131 do\u011frudan bir Signal'e d\u00f6n\u00fc\u015ft\u00fcrmenin daha deklaratif ve y\u00f6netilebilir bir yolunu sunar. Bu, \u00f6zellikle servislerden gelen verileri do\u011frudan bile\u015fenlerdeki Signal'lere ba\u011flamak i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.\n    <\/div>\n<pre><code class=\"language-typescript\">\n\/\/ toSignal kullan\u0131m\u0131 ile daha temiz bir yakla\u015f\u0131m\nimport { Component, inject, signal } from '@angular\/core';\nimport { Product, ProductService } from '..\/services\/product.service';\nimport { toSignal } from '@angular\/core\/rxjs-interop';\n\n@Component({\n  selector: 'app-product-list-simplified',\n  standalone: true,\n  template: <code><h2>Basitle\u015ftirilmi\u015f \u00dcr\u00fcn Listesi<\/h2>\n    <div *ngIf=\"products.pending\">\u00dcr\u00fcnler y\u00fckleniyor...<\/div>\n    <div *ngIf=\"products.error\" class=\"error\">Hata olu\u015ftu: {{ products.error?.message }}<\/div>\n    <ul>\n      <li *ngFor=\"let product of products.value\">\n        {{ product.name }} - {{ product.price | currency:&#039;USD&#039;:&#039;symbol&#039;:&#039;1.2-2&#039; }}\n      <\/li>\n    <\/ul><\/code>,\n  styleUrls: ['.\/product-list.component.css']\n})\nexport class ProductListSimplifiedComponent {\n  private productService = inject(ProductService);\n\n  \/\/ toSignal ile Observable do\u011frudan bir Signal'e d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcyor\n  \/\/ toSignal, loading ve error durumlar\u0131n\u0131 da otomatik y\u00f6netir.\n  products = toSignal(this.productService.getProducts(), { initialValue: [] });\n}\n    <\/pre>\n<p><\/code><\/p>\n<p><code>toSignal<\/code> kullan\u0131m\u0131, hem y\u00fcklenme hem de hata durumlar\u0131n\u0131 otomatik olarak y\u00f6neten bir <code>Signal<T | undefined><\/code> d\u00f6nd\u00fcr\u00fcr ve daha az boilerplate kodu yazman\u0131z\u0131 sa\u011flar.<\/p>\n<h4>Ad\u0131m 3: <code>computed()<\/code> ile Filtreleme ve Dinamik Hesaplamalar<\/h4>\n<p>\u015eimdi \u00fcr\u00fcn listemize filtreleme \u00f6zelli\u011fi ekleyelim. Bir filtre terimi i\u00e7in bir Signal tan\u0131mlayacak ve bu Signal ile \u00fcr\u00fcnler Signal'ini kullanarak filtrelenmi\u015f \u00fcr\u00fcnleri hesaplayacak bir <code>computed<\/code> Signal olu\u015fturaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ src\/app\/product-list\/product-list.component.ts (Devam\u0131)\nimport { Component, OnInit, inject, signal, computed } from '@angular\/core';\nimport { Product, ProductService } from '..\/services\/product.service';\nimport { toSignal } from '@angular\/core\/rxjs-interop';\nimport { CommonModule, CurrencyPipe } from '@angular\/common'; \/\/ NgFor ve CurrencyPipe i\u00e7in\n\n@Component({\n  selector: 'app-product-list',\n  standalone: true,\n  imports: [CommonModule, CurrencyPipe], \/\/ Mod\u00fclleri buraya ekleyin\n  template: <code><h2>\u00dcr\u00fcn Listesi<\/h2>\n    <input type=\"text\" [(ngModel)]=\"searchTerm\" placeholder=\"\u00dcr\u00fcn ara...\" \/>\n    <div *ngIf=\"productsSignal().pending\">\u00dcr\u00fcnler y\u00fckleniyor...<\/div>\n    <div *ngIf=\"productsSignal().error\" class=\"error\">Hata olu\u015ftu: {{ productsSignal().error?.message }}<\/div>\n    <p>G\u00f6sterilen \u00dcr\u00fcn Say\u0131s\u0131: {{ filteredProducts().length }}<\/p>\n    <ul>\n      <li *ngFor=\"let product of filteredProducts()\">\n        {{ product.name }} ({{ product.category }}) - {{ product.price | currency:&#039;USD&#039;:&#039;symbol&#039;:&#039;1.2-2&#039; }}\n      <\/li>\n    <\/ul><\/code>,\n  styleUrls: ['.\/product-list.component.css']\n})\nexport class ProductListComponent {\n  private productService = inject(ProductService);\n\n  \/\/ toSignal ile y\u00fcklenen \u00fcr\u00fcnler\n  productsSignal = toSignal(this.productService.getProducts(), { initialValue: [] });\n\n  \/\/ Arama terimi i\u00e7in bir Signal\n  searchTerm = signal('');\n\n  \/\/ Filtrelenmi\u015f \u00fcr\u00fcnler i\u00e7in bir computed Signal\n  filteredProducts = computed(() => {\n    const products = this.productsSignal().value || [];\n    const term = this.searchTerm().toLowerCase();\n\n    if (!term) {\n      return products;\n    }\n\n    return products.filter(product =>\n      product.name.toLowerCase().includes(term) ||\n      product.category.toLowerCase().includes(term)\n    );\n  });\n}\n    <\/pre>\n<p><\/code><\/p>\n<p><code>searchTerm<\/code> bir Signal oldu\u011fu i\u00e7in, de\u011feri de\u011fi\u015fti\u011finde <code>filteredProducts<\/code> <code>computed<\/code> Signal'i otomatik olarak yeniden hesaplanacak ve UI'da filtrelenmi\u015f liste g\u00fcncellenecektir. Bu, Angular'\u0131n de\u011fi\u015fim tespit mekanizmas\u0131ndan ba\u011f\u0131ms\u0131z ve sadece ilgili k\u0131s\u0131mlar\u0131 g\u00fcncelleyerek y\u00fcksek performans sa\u011flar.<\/p>\n<h4>Ad\u0131m 4: Kullan\u0131c\u0131 Etkile\u015fimlerini <code>effect()<\/code> ile Y\u00f6netme (\u0130ste\u011fe Ba\u011fl\u0131 Yan Etkiler)<\/h4>\n<p><code>effect<\/code>, bir Signal de\u011fi\u015fti\u011finde bir yan etkiyi \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r. Genellikle DOM manip\u00fclasyonlar\u0131, loglama veya \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerle entegrasyon gibi durumlar i\u00e7in tercih edilir. \u00d6rne\u011fin, arama terimi her de\u011fi\u015fti\u011finde konsola bir mesaj yazd\u0131rmak isteyebilirsiniz:<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ src\/app\/product-list\/product-list.component.ts (Devam\u0131)\nimport { effect } from '@angular\/core';\n\/\/ ... di\u011fer import'lar\n\n@Component({\n  \/\/ ...\n})\nexport class ProductListComponent {\n  \/\/ ... di\u011fer Signal'ler ve metotlar\n\n  constructor() {\n    \/\/ Arama terimi her de\u011fi\u015fti\u011finde \u00e7al\u0131\u015facak bir effect\n    effect(() => {\n      console.log('Yeni arama terimi:', this.searchTerm());\n      \/\/ Belki bir analiz servisine log g\u00f6nderebiliriz\n    });\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu <code>effect<\/code>, <code>searchTerm<\/code> Signal'i her de\u011fi\u015fti\u011finde \u00e7al\u0131\u015facak ve ilgili yan etkiyi ger\u00e7ekle\u015ftirecektir. Ancak unutmay\u0131n, <code>effect<\/code>'ler genellikle UI g\u00fcncellemeleri veya do\u011frudan Signal de\u011ferlerini de\u011fi\u015ftirmek i\u00e7in kullan\u0131lmamal\u0131d\u0131r; bunun yerine <code>computed<\/code> Signal'ler veya bile\u015fen \u015fablonlar\u0131 tercih edilmelidir. Bu pratik uygulama, RxJS ve Signals'\u0131n birlikte nas\u0131l modern ve reaktif bir Angular uygulamas\u0131 olu\u015fturmak i\u00e7in kullan\u0131labilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir.<\/p>\n<h2>Vaka Analizi: B\u00fcy\u00fck \u00d6l\u00e7ekli Bir Uygulamada Performans Optimizasyonu Nas\u0131l Sa\u011flan\u0131r?<\/h2>\n<p>B\u00fcy\u00fck ve karma\u015f\u0131k Angular uygulamalar\u0131nda performans, her zaman \u00f6ncelikli bir konudur. Geleneksel Zone.js tabanl\u0131 de\u011fi\u015fim tespit mekanizmas\u0131, uygulaman\u0131n her yerindeki olas\u0131 de\u011fi\u015fiklikleri kontrol etmek i\u00e7in kaynak t\u00fcketebilir, bu da \u00f6zellikle s\u0131k g\u00fcncellenen verilerle \u00e7al\u0131\u015fan bile\u015fenlerde performans sorunlar\u0131na yol a\u00e7abilir. RxJS ve Signals'\u0131n birle\u015fimi, bu t\u00fcr senaryolarda \u00f6nemli bir performans art\u0131\u015f\u0131 sa\u011flayabilir. Bu b\u00f6l\u00fcmde, bir e-ticaret sepet uygulamas\u0131 \u00fczerinden bu optimizasyonu inceleyece\u011fiz.<\/p>\n<h3>Senaryo: Dinamik Sepet Durumu Y\u00f6netimi<\/h3>\n<p>Bir e-ticaret uygulamas\u0131nda, kullan\u0131c\u0131lar\u0131n sepetine \u00fcr\u00fcn ekleyip \u00e7\u0131karmas\u0131, miktarlar\u0131 de\u011fi\u015ftirmesi gibi etkile\u015fimler s\u00fcrekli olarak ger\u00e7ekle\u015fir. Sepet durumu (\u00fcr\u00fcn say\u0131s\u0131, toplam fiyat, indirimler vb.) s\u0131k s\u0131k g\u00fcncellenir ve bu g\u00fcncellemelerin uygulaman\u0131n farkl\u0131 yerlerindeki bile\u015fenlere (\u00f6rne\u011fin, navigasyon \u00e7ubu\u011fundaki sepet simgesi, sepet sayfas\u0131, \u00f6deme \u00f6zeti) yans\u0131mas\u0131 gerekir. Geleneksel olarak bu durum, bir <code>BehaviorSubject<\/code> veya bir servis arac\u0131l\u0131\u011f\u0131yla y\u00f6netilirdi ve her de\u011fi\u015fiklik, Zone.js taraf\u0131ndan t\u00fcm uygulaman\u0131n de\u011fi\u015fim tespit d\u00f6ng\u00fcs\u00fcn\u00fc tetikleyebilirdi.<\/p>\n<h4>Geleneksel Yakla\u015f\u0131mdaki Performans Sorunlar\u0131<\/h4>\n<p>E\u011fer sepet verisi bir <code>Observable<\/code> olarak tutulup bile\u015fenlerde <code>async<\/code> pipe ile kullan\u0131l\u0131yorsa, bu bile\u015fenlerin <code>OnPush<\/code> de\u011fi\u015fim tespit stratejisiyle bile, her sepet g\u00fcncellemesinde (observable yeni bir de\u011fer yayd\u0131\u011f\u0131nda) ilgili bile\u015fenin ve alt bile\u015fenlerinin de\u011fi\u015fim tespiti \u00e7al\u0131\u015fabilirdi. \u00d6zellikle b\u00fcy\u00fck bir bile\u015fen a\u011fac\u0131nda veya \u00e7ok say\u0131da e\u015fzamanl\u0131 veri ak\u0131\u015f\u0131nda, bu durum gereksiz hesaplamalara ve yava\u015flamaya yol a\u00e7abilirdi.<\/p>\n<h4>RxJS ve Signals ile Sepet Durumu Optimizasyonu<\/h4>\n<p>\u015eimdi, RxJS ve Signals'\u0131 birle\u015ftirerek bu senaryoyu nas\u0131l optimize edebilece\u011fimizi g\u00f6relim. Sepet durumunu y\u00f6netmek i\u00e7in yine RxJS <code>BehaviorSubject<\/code> kullanaca\u011f\u0131z, ancak bu <code>Subject<\/code>'ten gelen veriyi do\u011frudan Signals'a ba\u011flayarak UI reaktivitesini granular hale getirece\u011fiz.<\/p>\n<h5>Ad\u0131m 1: Sepet Verisini RxJS ile Y\u00f6netme<\/h5>\n<p>\u00d6ncelikle, sepet verisini tutacak ve bu verilere eri\u015fim sa\u011flayacak bir <code>CartService<\/code> olu\u015ftural\u0131m. Bu servis, <code>BehaviorSubject<\/code> kullanarak sepet durumunu yayacak ve di\u011fer bile\u015fenlerin abone olmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ src\/app\/services\/cart.service.ts\nimport { Injectable } from '@angular\/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs\/operators';\n\nexport interface CartItem {\n  productId: number;\n  name: string;\n  price: number;\n  quantity: number;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class CartService {\n  private _cartItems = new BehaviorSubject<CartItem[]>([]);\n  readonly cartItems$: Observable<CartItem[]> = this._cartItems.asObservable();\n\n  constructor() {\n    \/\/ Uygulama y\u00fcklendi\u011finde sepeti localStorage'dan y\u00fckle\n    const storedCart = localStorage.getItem('cart');\n    if (storedCart) {\n      this._cartItems.next(JSON.parse(storedCart));\n    }\n    \/\/ Her sepet de\u011fi\u015fti\u011finde localStorage'a kaydet\n    this.cartItems$.subscribe(items => {\n      localStorage.setItem('cart', JSON.stringify(items));\n    });\n  }\n\n  addToCart(product: { id: number; name: string; price: number }): void {\n    const currentItems = this._cartItems.getValue();\n    const existingItem = currentItems.find(item => item.productId === product.id);\n\n    if (existingItem) {\n      existingItem.quantity++;\n    } else {\n      currentItems.push({ ...product, quantity: 1 });\n    }\n    this._cartItems.next(currentItems);\n  }\n\n  removeFromCart(productId: number): void {\n    const currentItems = this._cartItems.getValue().filter(item => item.productId !== productId);\n    this._cartItems.next(currentItems);\n  }\n\n  getTotalItems(): Observable<number> {\n    return this.cartItems$.pipe(\n      map(items => items.reduce((acc, item) => acc + item.quantity, 0))\n    );\n  }\n\n  getTotalPrice(): Observable<number> {\n    return this.cartItems$.pipe(\n      map(items => items.reduce((acc, item) => acc + (item.quantity * item.price), 0))\n    );\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu servis, sepet durumunu <code>_cartItems<\/code> <code>BehaviorSubject<\/code>'inde tutar. <code>addToCart<\/code> ve <code>removeFromCart<\/code> gibi metotlarla sepeti g\u00fcnceller ve <code>cartItems$<\/code> Observable'\u0131 arac\u0131l\u0131\u011f\u0131yla sepet durumunu d\u0131\u015f d\u00fcnyaya a\u00e7ar. Ayr\u0131ca sepetin toplam \u00fcr\u00fcn say\u0131s\u0131 ve toplam fiyat\u0131 gibi t\u00fcretilmi\u015f veriler i\u00e7in de Observable'lar sunar.<\/p>\n<h5>Ad\u0131m 2: Signals ile Sepetin UI Taraf\u0131nda Reaktif G\u00f6sterimi<\/h5>\n<p>\u015eimdi bir <code>CartSummaryComponent<\/code> olu\u015ftural\u0131m. Bu bile\u015fen, sepetin toplam \u00fcr\u00fcn say\u0131s\u0131n\u0131 ve toplam fiyat\u0131n\u0131 g\u00f6sterecektir. RxJS Observable'lar\u0131n\u0131 do\u011frudan Signals'a d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in <code>toSignal<\/code> fonksiyonunu kullanaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ src\/app\/cart-summary\/cart-summary.component.ts\nimport { Component, inject } from '@angular\/core';\nimport { CartService } from '..\/services\/cart.service';\nimport { toSignal } from '@angular\/core\/rxjs-interop';\nimport { CommonModule, CurrencyPipe } from '@angular\/common'; \/\/ Gerekli mod\u00fcller\n\n@Component({\n  selector: 'app-cart-summary',\n  standalone: true,\n  imports: [CommonModule, CurrencyPipe],\n  template: <code><div class=\"cart-summary\">\n      <h3>Sepet \u00d6zeti<\/h3>\n      <p>Toplam \u00dcr\u00fcn Say\u0131s\u0131: <strong>{{ totalItems() }}<\/strong><\/p>\n      <p>Toplam Fiyat: <strong>{{ totalPrice() | currency:&#039;USD&#039;:&#039;symbol&#039;:&#039;1.2-2&#039; }}<\/strong><\/p>\n      <button (click)=\"clearCart()\">Sepeti Bo\u015falt<\/button>\n    <\/div><\/code>,\n  styleUrls: ['.\/cart-summary.component.css']\n})\nexport class CartSummaryComponent {\n  private cartService = inject(CartService);\n\n  \/\/ toSignal kullanarak Observable'lar\u0131 Signal'lara d\u00f6n\u00fc\u015ft\u00fcr\u00fcyoruz\n  totalItems = toSignal(this.cartService.getTotalItems(), { initialValue: 0 });\n  totalPrice = toSignal(this.cartService.getTotalPrice(), { initialValue: 0 });\n\n  clearCart() {\n    \/\/ Sepeti bo\u015faltma i\u015flevi eklenebilir\n    \/\/ this.cartService.clearCart();\n    console.log('Sepet bo\u015falt\u0131ld\u0131 (\u00f6rnek).');\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu bile\u015fen, <code>totalItems<\/code> ve <code>totalPrice<\/code> Signal'lerini do\u011frudan <code>CartService<\/code>'ten gelen Observable'lardan t\u00fcretir. Herhangi bir sepet \u00f6\u011fesi eklendi\u011finde veya kald\u0131r\u0131ld\u0131\u011f\u0131nda, <code>CartService<\/code>'teki <code>BehaviorSubject<\/code> yeni bir de\u011fer yayar. Bu de\u011fer, <code>toSignal<\/code> sayesinde otomatik olarak <code>totalItems<\/code> ve <code>totalPrice<\/code> Signal'lerini g\u00fcnceller. En \u00f6nemlisi, bu Signal'ler de\u011fi\u015fti\u011finde, sadece bu Signal'lere ba\u011f\u0131ml\u0131 olan bile\u015fen (<code>CartSummaryComponent<\/code>) ve sadece ilgili DOM par\u00e7alar\u0131 g\u00fcncellenir. Bu, Zone.js'in t\u00fcm uygulamay\u0131 tarama ihtiyac\u0131n\u0131 ortadan kald\u0131rarak \u00f6nemli bir performans art\u0131\u015f\u0131 sa\u011flar.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Angular Signals, Zone.js'siz Angular uygulamalar\u0131 olu\u015fturma yolunda \u00f6nemli bir ad\u0131md\u0131r. Bile\u015fenlerinizin reaktivitesini Signal'ler \u00fczerine kurdu\u011funuzda, de\u011fi\u015fim tespiti \u00e7ok daha hassas ve verimli hale gelir.\n    <\/div>\n<h4>Mobil Uyumlu Tasar\u0131m ve Performans<\/h4>\n<p>Performans optimizasyonu sadece JavaScript \u00e7al\u0131\u015fma zaman\u0131yla s\u0131n\u0131rl\u0131 de\u011fildir; ayn\u0131 zamanda kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn (UI) mobil cihazlarda nas\u0131l davrand\u0131\u011f\u0131 da \u00f6nemlidir. Signals, UI reaktivitesini optimize ederken, CSS media query'leri ile de mobil uyumlulu\u011fu sa\u011flayabiliriz. \u00d6rne\u011fin, sepet detaylar\u0131n\u0131 i\u00e7eren bir tablo, k\u00fc\u00e7\u00fck ekranlarda dikey liste olarak g\u00f6sterilebilir:<\/p>\n<pre><code class=\"language-css\">\n\/* src\/app\/cart-detail\/cart-detail.component.css *\/\n.cart-table {\n  width: 100%;\n  border-collapse: collapse;\n}\n\n.cart-table th, .cart-table td {\n  border: 1px solid #ddd;\n  padding: 8px;\n  text-align: left;\n}\n\n\/* Mobil cihazlar i\u00e7in (ekran geni\u015fli\u011fi 768px'den k\u00fc\u00e7\u00fck) *\/\n@media (max-width: 768px) {\n  .cart-table, .cart-table thead, .cart-table tbody, .cart-table th, .cart-table td, .cart-table tr {\n    display: block;\n  }\n  .cart-table thead tr {\n    position: absolute;\n    top: -9999px;\n    left: -9999px; \/* Ba\u015fl\u0131klar\u0131 gizle *\/\n  }\n  .cart-table tr {\n    margin-bottom: 15px;\n    border: 1px solid #eee;\n  }\n  .cart-table td {\n    border: none;\n    border-bottom: 1px solid #eee;\n    position: relative;\n    padding-left: 50%; \/* Etiket i\u00e7in yer a\u00e7 *\/\n    text-align: right;\n  }\n  .cart-table td::before {\n    position: absolute;\n    left: 6px;\n    width: 45%;\n    padding-right: 10px;\n    white-space: nowrap;\n    content: attr(data-label); \/* data-label niteli\u011fini etiket olarak kullan *\/\n    font-weight: bold;\n    text-align: left;\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu CSS, <code>@media<\/code> sorgusu ile belirli ekran boyutlar\u0131n\u0131n alt\u0131nda sepet tablosunu y\u0131\u011f\u0131nlanm\u0131\u015f bir g\u00f6r\u00fcn\u00fcme d\u00f6n\u00fc\u015ft\u00fcr\u00fcr, bu da mobil cihazlarda kullan\u0131c\u0131 deneyimini iyile\u015ftirir. B\u00f6ylece, hem JavaScript \u00e7al\u0131\u015fma zaman\u0131 performans\u0131 hem de g\u00f6rsel kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kapsaml\u0131 bir optimizasyon sa\u011flanm\u0131\u015f olur.<\/p>\n<p>Bu vaka analizi, RxJS'in g\u00fc\u00e7l\u00fc veri ak\u0131\u015f\u0131 y\u00f6netimini ve Signals'\u0131n granular reaktivitesini birle\u015ftirmenin, \u00f6zellikle s\u0131k g\u00fcncellenen ve uygulaman\u0131n bir\u00e7ok yerinde yans\u0131mas\u0131 gereken durumlarda nas\u0131l \u00f6nemli performans avantajlar\u0131 sa\u011flad\u0131\u011f\u0131n\u0131 g\u00f6stermektedir. Bu yakla\u015f\u0131m, daha az karma\u015f\u0131k, daha \u00f6ng\u00f6r\u00fclebilir ve daha h\u0131zl\u0131 Angular uygulamalar\u0131 geli\u015ftirmemize olanak tan\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey Teknikler: RxJS ve Signals Birlikteli\u011finde Hata Y\u00f6netimi ve Yan Etkileri Nas\u0131l Kontrol Alt\u0131na Al\u0131n\u0131r?<\/h2>\n<p>Reaktif programlaman\u0131n do\u011fas\u0131nda asenkron i\u015flemler ve veri ak\u0131\u015flar\u0131 bulunur, bu da hata y\u00f6netimini kritik hale getirir. Ayn\u0131 zamanda, Signals ile gelen <code>effect<\/code> gibi yan etki mekanizmalar\u0131 da dikkatli kullan\u0131lmad\u0131\u011f\u0131nda sorunlara yol a\u00e7abilir. Bu b\u00f6l\u00fcmde, RxJS ve Signals'\u0131 birlikte kullan\u0131rken hata y\u00f6netimini nas\u0131l sa\u011flamla\u015ft\u0131raca\u011f\u0131m\u0131z\u0131 ve yan etkileri nas\u0131l g\u00fcvenli bir \u015fekilde y\u00f6netece\u011fimizi inceleyece\u011fiz.<\/p>\n<h3>RxJS Ak\u0131\u015flar\u0131nda Hata Y\u00f6netimi Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>RxJS, Observable ak\u0131\u015flar\u0131ndaki hatalar\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc operat\u00f6rler sunar. Bu operat\u00f6rler, bir ak\u0131\u015fta hata olu\u015ftu\u011funda ak\u0131\u015f\u0131n tamamen durmas\u0131n\u0131 engellemek veya hatadan kurtulup ak\u0131\u015f\u0131 devam ettirmek i\u00e7in kullan\u0131labilir.<\/p>\n<ul>\n<li><strong><code>catchError<\/code>:<\/strong> Bir Observable'da hata olu\u015ftu\u011funda, bu operat\u00f6r hatay\u0131 yakalar ve yerine ba\u015fka bir Observable d\u00f6nd\u00fcrerek ak\u0131\u015f\u0131n devam etmesini sa\u011flar. Genellikle kullan\u0131c\u0131ya bir hata mesaj\u0131 g\u00f6stermek veya varsay\u0131lan bir de\u011fer sa\u011flamak i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><strong><code>retry<\/code> \/ <code>retryWhen<\/code>:<\/strong> Belirli bir hata durumunda Observable'\u0131 yeniden denemek i\u00e7in kullan\u0131l\u0131r. <code>retry<\/code> belirli bir say\u0131da yeniden deneme yaparken, <code>retryWhen<\/code> daha karma\u015f\u0131k yeniden deneme stratejileri (\u00f6rne\u011fin, gecikmeli yeniden denemeler) i\u00e7in bir Observable al\u0131r.<\/li>\n<\/ul>\n<pre><code class=\"language-typescript\">\n\/\/ src\/app\/services\/product.service.ts (G\u00fcncellenmi\u015f)\nimport { Injectable } from '@angular\/core';\nimport { HttpClient, HttpErrorResponse } from '@angular\/common\/http';\nimport { Observable, of, throwError } from 'rxjs';\nimport { catchError, tap, retry } from 'rxjs\/operators';\n\n\/\/ ... (Product aray\u00fcz\u00fc ve di\u011fer import'lar)\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ProductService {\n  private productsUrl = 'api\/products'; \/\/ \u00d6rnek bir API endpoint'i\n\n  constructor(private http: HttpClient) {}\n\n  getProducts(): Observable<Product[]> {\n    return this.http.get<Product[]>(this.productsUrl)\n      .pipe(\n        tap(products => console.log('\u00dcr\u00fcnler y\u00fcklendi:', products.length)),\n        retry(2), \/\/ API \u00e7a\u011fr\u0131s\u0131n\u0131 2 kez yeniden dene\n        catchError(this.handleError) \/\/ T\u00fcm yeniden denemelerden sonra hala hata varsa yakala\n      );\n  }\n\n  private handleError(error: HttpErrorResponse): Observable<never> {\n    let errorMessage = 'Bilinmeyen bir hata olu\u015ftu!';\n    if (error.error instanceof ErrorEvent) {\n      \/\/ Client-side veya network hatas\u0131\n      errorMessage = <code>Bir hata olu\u015ftu: ${error.error.message}<\/code>;\n    } else {\n      \/\/ Backend hatas\u0131\n      errorMessage = <code>Sunucu hatas\u0131 - Kod: ${error.status}, Mesaj: ${error.message}<\/code>;\n    }\n    console.error(errorMessage);\n    return throwError(() => new Error(errorMessage)); \/\/ Hatay\u0131 yukar\u0131ya f\u0131rlat\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>getProducts<\/code> metodu, API \u00e7a\u011fr\u0131s\u0131n\u0131n ba\u015far\u0131s\u0131z olmas\u0131 durumunda 2 kez yeniden deneme yapar. T\u00fcm yeniden denemeler de ba\u015far\u0131s\u0131z olursa, <code>catchError<\/code> operat\u00f6r\u00fc hatay\u0131 yakalar ve \u00f6zelle\u015ftirilmi\u015f bir hata mesaj\u0131 ile <code>throwError<\/code> kullanarak hatay\u0131 abone olan bile\u015fene iletir. Bu, bile\u015fenin hata durumunu y\u00f6netmesini kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Signals ile Hata Durumlar\u0131n\u0131n UI'da G\u00f6sterimi<\/h3>\n<p>Abone oldu\u011fumuz RxJS ak\u0131\u015flar\u0131ndan gelen hatalar\u0131 yakalad\u0131ktan sonra, bu hata durumunu bir Signal arac\u0131l\u0131\u011f\u0131yla kullan\u0131c\u0131 aray\u00fcz\u00fcnde g\u00f6sterebiliriz. Bu, kullan\u0131c\u0131ya neyin yanl\u0131\u015f gitti\u011fi hakk\u0131nda an\u0131nda geri bildirim sa\u011flar.<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ src\/app\/product-list\/product-list.component.ts (Hata g\u00f6sterimi)\nimport { Component, OnInit, inject, signal, computed } from '@angular\/core';\nimport { Product, ProductService } from '..\/services\/product.service';\nimport { toSignal } from '@angular\/core\/rxjs-interop';\nimport { CommonModule, CurrencyPipe } from '@angular\/common';\n\n@Component({\n  selector: 'app-product-list',\n  standalone: true,\n  imports: [CommonModule, CurrencyPipe],\n  template: <code><h2>\u00dcr\u00fcn Listesi<\/h2>\n    <input type=\"text\" [(ngModel)]=\"searchTerm\" placeholder=\"\u00dcr\u00fcn ara...\" \/>\n    <div *ngIf=\"productsResult().state === &#039;pending&#039;\">\u00dcr\u00fcnler y\u00fckleniyor...<\/div>\n    <div *ngIf=\"productsResult().state === &#039;error&#039;\" class=\"error\">Hata olu\u015ftu: {{ productsResult().error?.message }}<\/div>\n    <p>G\u00f6sterilen \u00dcr\u00fcn Say\u0131s\u0131: {{ filteredProducts().length }}<\/p>\n    <ul>\n      <li *ngFor=\"let product of filteredProducts()\">\n        {{ product.name }} ({{ product.category }}) - {{ product.price | currency:&#039;USD&#039;:&#039;symbol&#039;:&#039;1.2-2&#039; }}\n      <\/li>\n    <\/ul><\/code>,\n  styleUrls: ['.\/product-list.component.css']\n})\nexport class ProductListComponent {\n  private productService = inject(ProductService);\n\n  \/\/ toSignal, Observable'\u0131n y\u00fcklenme, ba\u015far\u0131l\u0131 ve hata durumlar\u0131n\u0131 y\u00f6netir.\n  productsResult = toSignal(this.productService.getProducts(), { initialValue: [] });\n\n  searchTerm = signal('');\n\n  filteredProducts = computed(() => {\n    const products = this.productsResult().value || []; \/\/ value, ba\u015far\u0131l\u0131 durumda gelen veridir\n    const term = this.searchTerm().toLowerCase();\n\n    if (!term) {\n      return products;\n    }\n\n    return products.filter(product =>\n      product.name.toLowerCase().includes(term) ||\n      product.category.toLowerCase().includes(term)\n    );\n  });\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Burada <code>toSignal<\/code>'\u0131n d\u00f6nd\u00fcrd\u00fc\u011f\u00fc Signal'in <code>state<\/code> \u00f6zelli\u011fi (<code>'pending'<\/code>, <code>'complete'<\/code>, <code>'error'<\/code>) ve <code>error<\/code> \u00f6zelli\u011fi sayesinde, y\u00fckleme ve hata durumlar\u0131n\u0131 do\u011frudan \u015fablonda kontrol edebiliriz. Bu, \u00e7ok daha temiz ve reaktif bir hata y\u00f6netimi yakla\u015f\u0131m\u0131 sunar.<\/p>\n<h3>Yan Etkileri <code>effect()<\/code> ile G\u00fcvenli Y\u00f6netim: Dikkat Edilmesi Gerekenler<\/h3>\n<p><code>effect()<\/code> fonksiyonu, bir Signal de\u011fi\u015fti\u011finde \u00e7al\u0131\u015fan yan etkiler i\u00e7in tasarlanm\u0131\u015ft\u0131r. Ancak, bu fonksiyonu kullan\u0131rken baz\u0131 \u00f6nemli noktalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak gerekir:<\/p>\n<ul>\n<li><strong>Sadece Yan Etkiler \u0130\u00e7in:<\/strong> <code>effect<\/code>, durumu de\u011fi\u015ftirmek veya UI'\u0131 do\u011frudan g\u00fcncellemek i\u00e7in kullan\u0131lmamal\u0131d\u0131r. Bunun yerine, loglama, senkronizasyon, DOM'a do\u011frudan eri\u015fim gibi yan etkiler i\u00e7in idealdir.<\/li>\n<li><strong>Temizleme \u0130\u015flemleri:<\/strong> Bir <code>effect<\/code>, bir <code>DestroyRef<\/code> ile otomatik olarak temizlenir. Ancak, e\u011fer <code>effect<\/code> i\u00e7inde manuel olarak bir kaynak olu\u015fturursan\u0131z (\u00f6rne\u011fin, bir event listener), bunu manuel olarak temizlemeniz gerekebilir.<\/li>\n<li><strong>Sonsuz D\u00f6ng\u00fc Tehlikesi:<\/strong> Bir <code>effect<\/code> i\u00e7inde, izledi\u011fi bir Signal'i de\u011fi\u015ftirmek sonsuz bir d\u00f6ng\u00fcye yol a\u00e7abilir. Angular, bu durumu yakalamaya \u00e7al\u0131\u015fsa da dikkatli olmak \u00f6nemlidir. Bunun i\u00e7in <code>allowSignalWrites: true<\/code> se\u00e7ene\u011fi ile bu davran\u0131\u015fa izin vermeniz gerekir, ancak bu genellikle ka\u00e7\u0131n\u0131lmas\u0131 gereken bir durumdur.<\/li>\n<li><strong><code>untracked()<\/code> Kullan\u0131m\u0131:<\/strong> Bazen bir <code>effect<\/code> i\u00e7inde bir Signal'in de\u011ferini okumak istersiniz, ancak bu Signal'in <code>effect<\/code>'i tetiklemesini istemezsiniz. Bu durumda <code>untracked()<\/code> fonksiyonunu kullanabilirsiniz.<\/li>\n<\/ul>\n<pre><code class=\"language-typescript\">\n\/\/ src\/app\/product-list\/product-list.component.ts (effect \u00f6rne\u011fi)\nimport { Component, effect, signal, untracked } from '@angular\/core';\n\n@Component({\n  \/\/ ...\n})\nexport class ProductListComponent {\n  \/\/ ... di\u011fer Signal'ler\n\n  productCount = signal(0); \/\/ \u00d6rnek bir Signal\n  logLevel = signal('info'); \/\/ Ba\u015fka bir Signal\n\n  constructor() {\n    effect(() => {\n      \/\/ productCount de\u011fi\u015fti\u011finde bu effect \u00e7al\u0131\u015f\u0131r\n      if (this.logLevel() === 'info') {\n        \/\/ logLevel da okunuyor ama untracked oldu\u011fu i\u00e7in onun de\u011fi\u015fimi effect'i tetiklemez\n        console.log(<code>\u00dcr\u00fcn say\u0131s\u0131 de\u011fi\u015fti: ${this.productCount()} (LogLevel: ${untracked(this.logLevel)})<\/code>);\n      }\n    });\n\n    \/\/ Sonsuz d\u00f6ng\u00fcye neden olabilecek bir \u00f6rnek (KA\u00c7INILMALI!)\n    \/\/ effect(() => {\n    \/\/   this.productCount.set(this.productCount() + 1); \/\/ Bu sonsuz d\u00f6ng\u00fcye neden olabilir!\n    \/\/ }, { allowSignalWrites: true }); \/\/ \u00d6zel izinle \u00e7al\u0131\u015f\u0131r, ancak tehlikelidir\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p><code>untracked(this.logLevel)<\/code> kullanarak, <code>logLevel<\/code> Signal'i de\u011fi\u015fti\u011finde <code>effect<\/code>'in yeniden \u00e7al\u0131\u015fmas\u0131n\u0131 engellerken, o anki de\u011ferini okuyabiliriz. <code>allowSignalWrites: true<\/code> ise, <code>effect<\/code> i\u00e7inde Signal'e yazma izni verir; ancak bu, sadece \u00e7ok \u00f6zel durumlar ve dikkatli bir \u015fekilde kullan\u0131lmal\u0131d\u0131r, \u00e7\u00fcnk\u00fc kolayca sonsuz d\u00f6ng\u00fclere yol a\u00e7abilir.<\/p>\n<p>RxJS'in zengin hata yakalama operat\u00f6rleri ile Signals'\u0131n temiz hata durumu g\u00f6sterimini birle\u015ftirmek, daha sa\u011flam ve kullan\u0131c\u0131 dostu uygulamalar olu\u015fturman\u0131za olanak tan\u0131r. Ayn\u0131 zamanda, <code>effect<\/code>'lerin do\u011fru ve bilin\u00e7li kullan\u0131m\u0131, performans odakl\u0131 yan etkileri y\u00f6netmede anahtar rol oynar. Bu ileri d\u00fczey teknikler, Angular'da reaktif durum y\u00f6netimini bir sonraki seviyeye ta\u015f\u0131man\u0131z\u0131 sa\u011flar.<\/p>\n<h2>Sonu\u00e7: RxJS ve Signals Birlikteli\u011fi Angular Geli\u015ftirmeyi Nas\u0131l D\u00f6n\u00fc\u015ft\u00fcr\u00fcyor?<\/h2>\n<p>Angular ekosisteminde RxJS ve Signals'\u0131n birle\u015fimi, reaktif durum y\u00f6netimine modern, g\u00fc\u00e7l\u00fc ve performansa duyarl\u0131 bir bak\u0131\u015f a\u00e7\u0131s\u0131 getirmi\u015ftir. Bu makale boyunca, bu iki teknolojinin temel prensiplerini, birbirlerini nas\u0131l tamamlad\u0131klar\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l entegre edilebileceklerini detayl\u0131 bir \u015fekilde inceledik. Geleneksel yakla\u015f\u0131mlar\u0131n getirdi\u011fi zorluklara kar\u015f\u0131, bu sinerjinin sundu\u011fu avantajlar hem geli\u015ftirici deneyimini hem de son kullan\u0131c\u0131 performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rmaktad\u0131r.<\/p>\n<p>RxJS, asenkron veri ak\u0131\u015flar\u0131n\u0131 y\u00f6netmek, d\u00f6n\u00fc\u015ft\u00fcrmek ve hata durumlar\u0131n\u0131 ele almak i\u00e7in rakipsiz bir g\u00fc\u00e7 sunarken, Signals, bu ak\u0131\u015flardan gelen verileri al\u0131p UI bile\u015fenlerinin ve di\u011fer hesaplamalar\u0131n sadece gerekti\u011finde g\u00fcncellenmesini sa\u011flayarak \"granular reaktivite\" kavram\u0131n\u0131 hayat\u0131m\u0131za sokmu\u015ftur. Bu birliktelik, \u00f6zellikle s\u0131k g\u00fcncellenen veriler, karma\u015f\u0131k filtreleme mekanizmalar\u0131 ve ger\u00e7ek zamanl\u0131 etkile\u015fimler i\u00e7eren uygulamalarda, Zone.js'in potansiyel performans darbo\u011fazlar\u0131n\u0131 ortadan kald\u0131rarak ak\u0131c\u0131 ve h\u0131zl\u0131 bir deneyim sunar.<\/p>\n<p>Uygulad\u0131\u011f\u0131m\u0131z pratik \u00f6rnekler ve vaka analizleri, RxJS ile API'den veri \u00e7ekmenin, bu verileri <code>toSignal<\/code> ile Signals'a d\u00f6n\u00fc\u015ft\u00fcrmenin, <code>computed<\/code> ile dinamik hesaplamalar yapman\u0131n ve <code>effect<\/code> ile yan etkileri y\u00f6netmenin ne kadar kolay ve etkili oldu\u011funu g\u00f6sterdi. Hata y\u00f6netiminden mobil uyumlulu\u011fa kadar geni\u015f bir yelpazede ele ald\u0131\u011f\u0131m\u0131z konular, bu modern yakla\u015f\u0131m\u0131n uygulaman\u0131z\u0131n her katman\u0131na nas\u0131l de\u011fer katabilece\u011fini ortaya koydu.<\/p>\n<p>Sonu\u00e7 olarak, RxJS ve Signals'\u0131n birlikte kullan\u0131lmas\u0131, Angular geli\u015ftiricilerine daha temiz, daha \u00f6ng\u00f6r\u00fclebilir ve daha y\u00fcksek performansl\u0131 uygulamalar in\u015fa etme imkan\u0131 sunuyor. Bu, Angular'\u0131n gelecekteki reaktif programlama paradigmas\u0131n\u0131n temel ta\u015flar\u0131ndan biri olacak gibi g\u00f6r\u00fcn\u00fcyor. Mevcut projelerinizi a\u015famal\u0131 olarak bu yeni yakla\u015f\u0131ma ta\u015f\u0131mak veya yeni projelerinizi do\u011frudan bu temel \u00fczerine in\u015fa etmek, uygulaman\u0131z\u0131n \u00f6l\u00e7eklenebilirli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131racakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS):<\/h3>\n<dl>\n<dt>RxJS'e tamamen veda m\u0131 ediyoruz?<\/dt>\n<dd>Hay\u0131r, kesinlikle hay\u0131r. RxJS, asenkron veri ak\u0131\u015flar\u0131, karma\u015f\u0131k operat\u00f6rler ve olay tabanl\u0131 programlama i\u00e7in hala Angular ekosisteminin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Signals, senkron ve granular reaktiviteyi sa\u011flarken, RxJS \u00f6zellikle uzun s\u00fcreli, ak\u0131\u015fkan veya d\u0131\u015f kaynaklardan gelen asenkron verileri y\u00f6netmek i\u00e7in kullan\u0131lmaya devam edecektir. Bu iki teknoloji birbirini tamamlar.<\/dd>\n<dt>Signals kullanmak Zone.js'i tamamen kald\u0131r\u0131r m\u0131?<\/dt>\n<dd>Angular'\u0131n gelecekteki versiyonlar\u0131nda, Signals'\u0131n yayg\u0131nla\u015fmas\u0131yla Zone.js'in \u00e7o\u011fu durumda gereksiz hale gelmesi beklenmektedir. \u015eu an i\u00e7in, baz\u0131 durumlarda Zone.js hala arka planda \u00e7al\u0131\u015f\u0131yor olabilir, ancak Signals ile in\u015fa edilen bile\u015fenler Zone.js'ten ba\u011f\u0131ms\u0131z olarak daha verimli bir de\u011fi\u015fim tespiti yapar. Nihai hedef, geli\u015ftiricilerin Zone.js'i tamamen devre d\u0131\u015f\u0131 b\u0131rakarak uygulamalar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rma yetene\u011fine sahip olmas\u0131d\u0131r.<\/dd>\n<dt>Hangi durumda RxJS, hangi durumda Signals tercih edilmeli?<\/dt>\n<dd>Genel olarak, d\u0131\u015f kaynaklardan (API \u00e7a\u011fr\u0131lar\u0131, web socket'ler, kullan\u0131c\u0131 olaylar\u0131) gelen asenkron veri ak\u0131\u015flar\u0131n\u0131 y\u00f6netmek, d\u00f6n\u00fc\u015ft\u00fcrmek ve birle\u015ftirmek i\u00e7in RxJS kullanmal\u0131s\u0131n\u0131z. Uygulaman\u0131z\u0131n dahili durumunu (UI state, form de\u011ferleri) tutmak, bu durumu bile\u015fenler aras\u0131nda payla\u015fmak ve gran\u00fcler reaktivite ile UI'\u0131 g\u00fcncellemek i\u00e7in Signals idealdir. \u00d6zetle: RxJS ak\u0131\u015flar\u0131 y\u00f6netir, Signals durumu tutar.<\/dd>\n<dt>Signals ve Observable aras\u0131nda nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrme yapabiliriz?<\/dt>\n<dd>Angular 16+ ile gelen <code>@angular\/core\/rxjs-interop<\/code> paketi bu d\u00f6n\u00fc\u015f\u00fcmleri kolayla\u015ft\u0131r\u0131r:<\/p>\n<ul>\n<li><strong><code>toSignal(observable, options)<\/code>:<\/strong> Bir Observable'\u0131 bir Signal'e d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Observable'dan gelen her yeni de\u011fer Signal'i g\u00fcnceller.<\/li>\n<li><strong><code>toObservable(signal, options)<\/code>:<\/strong> Bir Signal'\u0131 bir Observable'a d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Signal'in de\u011feri her de\u011fi\u015fti\u011finde Observable yeni bir de\u011fer yayar.<\/li>\n<\/ul>\n<\/dd>\n<dt>Eski projelerde Signals'a ge\u00e7i\u015f kolay m\u0131?<\/dt>\n<dd>Evet, Angular Signals ile kademeli bir ge\u00e7i\u015f m\u00fcmk\u00fcnd\u00fcr. Angular, eski Zone.js tabanl\u0131 de\u011fi\u015fim tespiti ile Signals'\u0131 ayn\u0131 anda \u00e7al\u0131\u015ft\u0131rabilir. Bu, mevcut uygulamalar\u0131n\u0131z\u0131 par\u00e7a par\u00e7a Signals'a d\u00f6n\u00fc\u015ft\u00fcrmenize olanak tan\u0131r. Yeni bile\u015fenleri Signals ile yazmaya ba\u015flayabilir ve yava\u015f yava\u015f eski bile\u015fenlerdeki durum y\u00f6netimini Signals'a ta\u015f\u0131yabilirsiniz.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Angular uygulamalar\u0131nda durum y\u00f6netimi, performans ve geli\u015ftirici deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. Geleneksel yakla\u015f\u0131mlar\u0131n getirdi\u011fi zorluklara kar\u015f\u0131,&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1488],"tags":[],"class_list":{"0":"post-30703","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-angular","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Angular\u2019da RxJS ve Signals: Modern Reaktif Durum Y\u00f6netimi<\/title>\n<meta name=\"description\" content=\"Angular uygulamalar\u0131nda durum y\u00f6netimi, performans ve geli\u015ftirici deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. Geleneksel yakla\u015f\u0131mlar\u0131n getirdi\u011fi zorluklara kar\u015f\u0131, RxJS&#039;in g\u00fc\u00e7l\u00fc reaktif programlama yeteneklerini Angular Signals ile birle\u015ftirmek, daha modern, optimize edilmi\u015f ve sezgisel bir \u00e7\u00f6z\u00fcm sunar. Bu makalede, bu iki teknolojiyi bir araya getirerek uygulaman\u0131z\u0131n reaktivitesini nas\u0131l zirveye ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular\u2019da RxJS ve Signals: Modern Reaktif Durum Y\u00f6netimi\" \/>\n<meta property=\"og:description\" content=\"Angular uygulamalar\u0131nda durum y\u00f6netimi, performans ve geli\u015ftirici deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. Geleneksel yakla\u015f\u0131mlar\u0131n getirdi\u011fi zorluklara kar\u015f\u0131, RxJS&#039;in g\u00fc\u00e7l\u00fc reaktif programlama yeteneklerini Angular Signals ile birle\u015ftirmek, daha modern, optimize edilmi\u015f ve sezgisel bir \u00e7\u00f6z\u00fcm sunar. Bu makalede, bu iki teknolojiyi bir araya getirerek uygulaman\u0131z\u0131n reaktivitesini nas\u0131l zirveye ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-30T23:31:40+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Angular\u2019da RxJS ve Signals: Modern Reaktif Durum Y\u00f6netimi\",\"datePublished\":\"2025-09-30T23:31:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/\"},\"wordCount\":4103,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Angular\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/\",\"name\":\"Angular\u2019da RxJS ve Signals: Modern Reaktif Durum Y\u00f6netimi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-09-30T23:31:40+00:00\",\"description\":\"Angular uygulamalar\u0131nda durum y\u00f6netimi, performans ve geli\u015ftirici deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. Geleneksel yakla\u015f\u0131mlar\u0131n getirdi\u011fi zorluklara kar\u015f\u0131, RxJS'in g\u00fc\u00e7l\u00fc reaktif programlama yeteneklerini Angular Signals ile birle\u015ftirmek, daha modern, optimize edilmi\u015f ve sezgisel bir \u00e7\u00f6z\u00fcm sunar. Bu makalede, bu iki teknolojiyi bir araya getirerek uygulaman\u0131z\u0131n reaktivitesini nas\u0131l zirveye ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular\u2019da RxJS ve Signals: Modern Reaktif Durum Y\u00f6netimi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Angular\u2019da RxJS ve Signals: Modern Reaktif Durum Y\u00f6netimi","description":"Angular uygulamalar\u0131nda durum y\u00f6netimi, performans ve geli\u015ftirici deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. Geleneksel yakla\u015f\u0131mlar\u0131n getirdi\u011fi zorluklara kar\u015f\u0131, RxJS'in g\u00fc\u00e7l\u00fc reaktif programlama yeteneklerini Angular Signals ile birle\u015ftirmek, daha modern, optimize edilmi\u015f ve sezgisel bir \u00e7\u00f6z\u00fcm sunar. Bu makalede, bu iki teknolojiyi bir araya getirerek uygulaman\u0131z\u0131n reaktivitesini nas\u0131l zirveye ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/","og_locale":"tr_TR","og_type":"article","og_title":"Angular\u2019da RxJS ve Signals: Modern Reaktif Durum Y\u00f6netimi","og_description":"Angular uygulamalar\u0131nda durum y\u00f6netimi, performans ve geli\u015ftirici deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. Geleneksel yakla\u015f\u0131mlar\u0131n getirdi\u011fi zorluklara kar\u015f\u0131, RxJS'in g\u00fc\u00e7l\u00fc reaktif programlama yeteneklerini Angular Signals ile birle\u015ftirmek, daha modern, optimize edilmi\u015f ve sezgisel bir \u00e7\u00f6z\u00fcm sunar. Bu makalede, bu iki teknolojiyi bir araya getirerek uygulaman\u0131z\u0131n reaktivitesini nas\u0131l zirveye ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.","og_url":"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-09-30T23:31:40+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Angular\u2019da RxJS ve Signals: Modern Reaktif Durum Y\u00f6netimi","datePublished":"2025-09-30T23:31:40+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/"},"wordCount":4103,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Angular"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/","url":"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/","name":"Angular\u2019da RxJS ve Signals: Modern Reaktif Durum Y\u00f6netimi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-09-30T23:31:40+00:00","description":"Angular uygulamalar\u0131nda durum y\u00f6netimi, performans ve geli\u015ftirici deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. Geleneksel yakla\u015f\u0131mlar\u0131n getirdi\u011fi zorluklara kar\u015f\u0131, RxJS'in g\u00fc\u00e7l\u00fc reaktif programlama yeteneklerini Angular Signals ile birle\u015ftirmek, daha modern, optimize edilmi\u015f ve sezgisel bir \u00e7\u00f6z\u00fcm sunar. Bu makalede, bu iki teknolojiyi bir araya getirerek uygulaman\u0131z\u0131n reaktivitesini nas\u0131l zirveye ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/angularda-rxjs-ve-signals-modern-reaktif-durum-yonetimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular\u2019da RxJS ve Signals: Modern Reaktif Durum Y\u00f6netimi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30703","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=30703"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30703\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=30703"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=30703"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=30703"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}