{"id":34925,"date":"2025-11-23T18:31:12","date_gmt":"2025-11-23T15:31:12","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/"},"modified":"2025-11-23T18:31:12","modified_gmt":"2025-11-23T15:31:12","slug":"angular-v21-pratik-migrasyon-ve-signal-forms-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/","title":{"rendered":"Angular v21 &#8211; Pratik Migrasyon ve Signal Forms Rehberi"},"content":{"rendered":"<p><body><\/p>\n<p>Modern web geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, verimlilik ve kullan\u0131c\u0131 deneyimi her zamankinden daha kritik. Angular v21, bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak \u00fczere devrim niteli\u011finde yenilikler sunarken, \u00f6zellikle <strong>Signal Forms<\/strong> ile form y\u00f6netimini bamba\u015fka bir boyuta ta\u015f\u0131yor. Bu kapsaml\u0131 rehber, mevcut Angular projelerinizi v21&#8217;e sorunsuz bir \u015fekilde nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ve yeni Signal Forms API&#8217;sini usta bir \u015fekilde nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor, geli\u015ftirme s\u00fcrecinizi optimize etmeniz i\u00e7in pratik bilgiler sunuyor.<\/p>\n<p>Her Angular s\u00fcr\u00fcm\u00fcyle birlikte gelen yenilikler, geli\u015ftiricilere daha g\u00fc\u00e7l\u00fc, daha performansl\u0131 ve daha esnek uygulamalar olu\u015fturma imkan\u0131 sunar. Angular v21, bu gelene\u011fi s\u00fcrd\u00fcrerek, \u00f6zellikle <strong>Signal Forms<\/strong> ve geli\u015fmi\u015f reaktivite mekanizmalar\u0131 ile dikkat \u00e7ekiyor. Peki, projenizi v21&#8217;e ta\u015f\u0131mak neden bu kadar kritik? Cevap, sadece yeni \u00f6zelliklere eri\u015fimden ibaret de\u011fil; ayn\u0131 zamanda geli\u015ftirici deneyimini iyile\u015ftirmek, uygulama performans\u0131n\u0131 art\u0131rmak ve gelecekteki Angular g\u00fcncellemelerine daha kolay adapte olabilmek yat\u0131yor.<\/p>\n<p>\u00d6ncelikle, v21&#8217;in getirdi\u011fi performans iyile\u015ftirmelerini ele alal\u0131m. Angular tak\u0131m\u0131, \u00f6zellikle Change Detection mekanizmalar\u0131nda yap\u0131lan optimizasyonlarla, uygulamalar\u0131n daha az kaynak t\u00fcketerek daha h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 hedefliyor. Bu iyile\u015ftirmeler, b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda bile fark edilir bir h\u0131z art\u0131\u015f\u0131 sa\u011flayabilir. \u00d6rne\u011fin, y\u00fczlerce bile\u015feni olan bir e-ticaret uygulamas\u0131nda, \u00fcr\u00fcn listelemelerinden sepet g\u00fcncellemelerine kadar her etkile\u015fimde daha ak\u0131c\u0131 bir deneyim sunulabilir. Ayr\u0131ca, v21 ile birlikte baz\u0131 eski ve daha az verimli API&#8217;lerin kullan\u0131m\u0131 sona erdirilebilir veya yerini daha modern alternatiflere b\u0131rakabilir. Bu durum, projenizin &#8220;teknik borcunu&#8221; azaltma ve daha g\u00fcncel standartlara uyum sa\u011flama f\u0131rsat\u0131 sunar.<\/p>\n<p>Geli\u015ftirici deneyimi a\u00e7\u0131s\u0131ndan bak\u0131ld\u0131\u011f\u0131nda, <strong>Signal Forms<\/strong> gibi yenilikler, form y\u00f6netimini \u00e7ok daha sezgisel ve hatas\u0131z hale getiriyor. Geleneksel reaktif formlarda kar\u015f\u0131la\u015f\u0131lan baz\u0131 zorluklar (\u00f6rne\u011fin, manuel abonelik y\u00f6netimi veya de\u011fi\u015fmezlik prensiplerini koruma ihtiyac\u0131), Signal Forms ile \u00f6nemli \u00f6l\u00e7\u00fcde hafifliyor. Bu, geli\u015ftiricilerin form mant\u0131\u011f\u0131n\u0131 yazmaya daha fazla odaklanmas\u0131n\u0131 ve hata ay\u0131klama s\u00fcre\u00e7lerini k\u0131saltmas\u0131n\u0131 sa\u011fl\u0131yor. Daha az boilerplate kod ve daha net bir veri ak\u0131\u015f\u0131, \u00f6zellikle b\u00fcy\u00fck ekiplerde kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131yor. Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, \u00f6rne\u011fin bir kurumsal uygulaman\u0131n m\u00fc\u015fteri veri giri\u015f formlar\u0131nda, Signal Forms&#8217;un sa\u011flad\u0131\u011f\u0131 kolayl\u0131klar, hem geli\u015ftirme s\u00fcresini k\u0131saltacak hem de daha az hata i\u00e7eren formlar ortaya \u00e7\u0131karacakt\u0131r.<\/p>\n<p>Migrasyon stratejisi a\u00e7\u0131s\u0131ndan, Angular ekibi, mevcut projeleri yeni s\u00fcr\u00fcmlere ta\u015f\u0131ma s\u00fcrecini m\u00fcmk\u00fcn oldu\u011funca sorunsuz hale getirmeye \u00f6zen g\u00f6steriyor. <code>ng update<\/code> komutu, \u00e7o\u011fu durumda otomatik olarak ba\u011f\u0131ml\u0131l\u0131klar\u0131 g\u00fcnceller ve baz\u0131 yayg\u0131n kod d\u00fczenlemelerini yapar. Ancak, \u00f6zellikle b\u00fcy\u00fck projelerde veya uzun s\u00fcredir g\u00fcncellenmemi\u015f uygulamalarda manuel m\u00fcdahaleler gerekebilir. Bu nedenle, migrasyon \u00f6ncesinde projenin mevcut durumunu, kullan\u0131lan \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphaneleri ve deprecated (kullan\u0131mdan kald\u0131r\u0131lm\u0131\u015f) API&#8217;leri dikkatlice analiz etmek \u00f6nemlidir. \u00d6rne\u011fin, Angular CLI&#8217;nin sundu\u011fu linting ara\u00e7lar\u0131 veya <code>ng lint<\/code> komutlar\u0131, potansiyel uyumsuzluklar\u0131 veya eski kod yap\u0131lar\u0131n\u0131 tespit etmede yard\u0131mc\u0131 olabilir. Bir proje y\u00f6neticisinin bak\u0131\u015f a\u00e7\u0131s\u0131yla, v21&#8217;e ge\u00e7i\u015f, sadece yeni \u00f6zelliklere eri\u015fim de\u011fil, ayn\u0131 zamanda projenin genel sa\u011fl\u0131\u011f\u0131n\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rma f\u0131rsat\u0131 olarak g\u00f6r\u00fclmelidir. Bu ge\u00e7i\u015f, uzun vadede bak\u0131m maliyetlerini d\u00fc\u015f\u00fcrecek ve uygulaman\u0131z\u0131n modern web standartlar\u0131na uyumunu sa\u011flayacakt\u0131r.<\/p>\n<p>Dolay\u0131s\u0131yla, Angular v21&#8217;e ge\u00e7i\u015f, sadece bir s\u00fcr\u00fcm g\u00fcncellemesi de\u011fil, ayn\u0131 zamanda projenizi gelece\u011fe haz\u0131rlayan stratejik bir ad\u0131md\u0131r. Sundu\u011fu performans art\u0131\u015flar\u0131, geli\u015ftirici dostu \u00f6zellikler ve modern web standartlar\u0131na uyum, bu ge\u00e7i\u015fi her Angular geli\u015ftiricisi ve projesi i\u00e7in vazge\u00e7ilmez k\u0131lmaktad\u0131r.<\/p>\n<h2>Angular Signals Nedir ve Neden Geli\u015ftirildi? Temel Kavramlara Giri\u015f<\/h2>\n<p>Angular Signals, reaktif programlama paradigmas\u0131n\u0131 Angular ekosistemine daha derinlemesine entegre eden, bile\u015fenlerin durumunu y\u00f6netmek i\u00e7in yeni ve g\u00fc\u00e7l\u00fc bir mekanizmad\u0131r. Bu kavram, \u00f6zellikle uygulaman\u0131n veri ak\u0131\u015f\u0131n\u0131 ve de\u011fi\u015fim tespitini (Change Detection) optimize etme ihtiyac\u0131ndan do\u011fmu\u015ftur. Geleneksel Angular&#8217;da, Zone.js ve RxJS tabanl\u0131 Change Detection mekanizmas\u0131 g\u00fc\u00e7l\u00fc olsa da, bazen a\u015f\u0131r\u0131 kontroller nedeniyle performans darbo\u011fazlar\u0131na yol a\u00e7abilirdi. Signals, bu soruna daha gran\u00fcler ve hedefli bir yakla\u015f\u0131m getirerek, yaln\u0131zca ilgili verinin de\u011fi\u015fti\u011fi yerlerde g\u00fcncelleme yap\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Signals, temelde reaktif bir de\u011fer tutucusudur. Bir de\u011ferin zaman i\u00e7inde de\u011fi\u015fti\u011fini izlemenizi ve bu de\u011fi\u015fikliklere reaksiyon g\u00f6stermenizi sa\u011flar. En temel Signal t\u00fcr\u00fc, <code>signal()<\/code> fonksiyonu ile olu\u015fturulur. Bu fonksiyon, bir ba\u015flang\u0131\u00e7 de\u011feri al\u0131r ve bu de\u011feri okumak i\u00e7in bir fonksiyon (<code>.value<\/code>) ve de\u011fi\u015ftirmek i\u00e7in ba\u015fka bir fonksiyon (<code>.set()<\/code> veya <code>.update()<\/code>) d\u00f6nd\u00fcr\u00fcr. \u00d6rne\u011fin:<\/p>\n<pre><code>\n  import { signal } from '@angular\/core';\n\n  const counter = signal(0); \/\/ Ba\u015flang\u0131\u00e7 de\u011feri 0\n  console.log(counter.value); \/\/ 0 \u00e7\u0131kt\u0131s\u0131 verir\n\n  counter.set(5); \/\/ De\u011feri 5 olarak ayarlar\n  console.log(counter.value); \/\/ 5 \u00e7\u0131kt\u0131s\u0131 verir\n\n  counter.update(currentValue => currentValue + 1); \/\/ Mevcut de\u011feri art\u0131r\u0131r\n  console.log(counter.value); \/\/ 6 \u00e7\u0131kt\u0131s\u0131 verir\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>counter<\/code> bir signal'd\u0131r. De\u011feri <code>counter.value<\/code> ile okunur ve <code>set<\/code> veya <code>update<\/code> ile de\u011fi\u015ftirildi\u011finde, bu signal'\u0131 kullanan t\u00fcm ba\u011f\u0131ml\u0131 <code>computed<\/code> veya <code>effect<\/code> fonksiyonlar\u0131 otomatik olarak g\u00fcncellenir. \u0130\u015fte bu otomatik reaktivite, Signals'\u0131n temel g\u00fcc\u00fcd\u00fcr.<\/p>\n<p>\u0130ki ana yard\u0131mc\u0131 Signal t\u00fcr\u00fc daha vard\u0131r: <code>computed()<\/code> ve <code>effect()<\/code>.<br \/>\n<code>computed()<\/code> fonksiyonu, bir veya daha fazla Signal'dan t\u00fcretilmi\u015f bir de\u011fer olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. Bu t\u00fcretilmi\u015f de\u011fer de kendi ba\u015f\u0131na bir Signal gibi davran\u0131r ve ba\u011f\u0131ml\u0131 oldu\u011fu Signal'lar de\u011fi\u015fti\u011finde otomatik olarak yeniden hesaplan\u0131r. <code>computed<\/code> de\u011ferler, \u00f6zellikle karma\u015f\u0131k hesaplamalar\u0131 \u00f6nbelle\u011fe almak ve yaln\u0131zca ba\u011f\u0131ml\u0131l\u0131klar de\u011fi\u015fti\u011finde yeniden \u00e7al\u0131\u015ft\u0131rmak i\u00e7in idealdir. Bu, performans a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck avantajlar sa\u011flar. \u00d6rne\u011fin, bir al\u0131\u015fveri\u015f sepetindeki \u00fcr\u00fcnlerin toplam fiyat\u0131n\u0131 hesaplamak i\u00e7in kullan\u0131labilir:<\/p>\n<pre><code>\n  import { signal, computed } from '@angular\/core';\n\n  const price = signal(10);\n  const quantity = signal(2);\n\n  const totalPrice = computed(() => price.value * quantity.value);\n  console.log(totalPrice.value); \/\/ 20 \u00e7\u0131kt\u0131s\u0131 verir\n\n  quantity.set(3); \/\/ quantity de\u011fi\u015fti\u011finde totalPrice otomatik olarak yeniden hesaplan\u0131r\n  console.log(totalPrice.value); \/\/ 30 \u00e7\u0131kt\u0131s\u0131 verir\n<\/pre>\n<p><\/code><\/p>\n<p><code>effect()<\/code> fonksiyonu ise, bir veya daha fazla Signal'daki de\u011fi\u015fikliklere bir yan etki (side effect) olarak tepki vermek i\u00e7in kullan\u0131l\u0131r. Yan etkiler genellikle DOM g\u00fcncellemesi, API \u00e7a\u011fr\u0131s\u0131, loglama veya d\u0131\u015f sistemlerle etkile\u015fim gibi i\u015flemleri i\u00e7erir. <code>effect<\/code> fonksiyonlar\u0131 bir kez \u00e7al\u0131\u015f\u0131r ve ba\u011f\u0131ml\u0131 olduklar\u0131 Signal'lar de\u011fi\u015fti\u011finde tekrar \u00e7al\u0131\u015f\u0131r. <code>effect<\/code>'ler, Angular'\u0131n Change Detection d\u00f6ng\u00fcs\u00fc d\u0131\u015f\u0131nda \u00e7al\u0131\u015farak daha fazla kontrol ve performans sunar. Ancak, <code>effect<\/code>'leri dikkatli kullanmak ve i\u00e7inde \u00e7ok karma\u015f\u0131k mant\u0131k y\u00fcr\u00fctmekten ka\u00e7\u0131nmak \u00f6nemlidir, \u00e7\u00fcnk\u00fc bu durum uygulaman\u0131n veri ak\u0131\u015f\u0131n\u0131 karma\u015f\u0131kla\u015ft\u0131rabilir.<\/p>\n<pre><code>\n  import { signal, effect } from '@angular\/core';\n\n  const username = signal('Ali');\n\n  effect(() => {\n    console.log(<code>Kullan\u0131c\u0131 ad\u0131 de\u011fi\u015fti: ${username.value}<\/code>);\n  });\n\n  username.set('Veli'); \/\/ Console'a \"Kullan\u0131c\u0131 ad\u0131 de\u011fi\u015fti: Veli\" yazar\n<\/pre>\n<p><\/code><\/p>\n<blockquote>\n<p>Uzman \u0130pucu: <code>effect<\/code>'leri, bile\u015fen ya\u015fam d\u00f6ng\u00fcs\u00fc hook'lar\u0131na alternatif olarak, \u00f6zellikle bir Signal de\u011fi\u015fti\u011finde bir d\u0131\u015f sistemi g\u00fcncellemek veya bir DOM \u00f6\u011fesiyle do\u011frudan etkile\u015fim kurmak gibi senaryolarda kullanabilirsiniz. Ancak, <code>effect<\/code>'lerin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n do\u011fru bir \u015fekilde y\u00f6netilmesi, sonsuz d\u00f6ng\u00fclerin \u00f6n\u00fcne ge\u00e7mek i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<\/blockquote>\n<p>Signals'\u0131n geli\u015ftirilmesinin temel amac\u0131, Angular uygulamalar\u0131nda daha \u00f6ng\u00f6r\u00fclebilir, daha performansl\u0131 ve daha kolay bir durum y\u00f6netimi sa\u011flamakt\u0131r. Zone.js tabanl\u0131 Change Detection modelinde, her potansiyel de\u011fi\u015fiklik, genellikle t\u00fcm bile\u015fen a\u011fac\u0131n\u0131n kontrol edilmesine neden olabilir. Signals ile birlikte ise, Angular sadece ger\u00e7ekten etkilenen bile\u015fenleri ve ilgili k\u0131s\u0131mlar\u0131 yeniden render eder. Bu, \u00f6zellikle b\u00fcy\u00fck ve veri yo\u011fun uygulamalarda \u00f6nemli \u00f6l\u00e7\u00fcde performans art\u0131\u015f\u0131 demektir. Signals, reaktif programlaman\u0131n g\u00fcc\u00fcn\u00fc daha do\u011frudan ve Angular'a \u00f6zg\u00fc bir \u015fekilde sunarak, geli\u015ftiricilerin daha verimli kod yazmas\u0131na olanak tan\u0131r.<\/p>\n<h2>Signal Forms ile Tan\u0131\u015fma: Neden Standart Formlardan Daha \u0130yidir?<\/h2>\n<p>Angular'\u0131n reaktif formlar\u0131, uzun s\u00fcredir form y\u00f6netimi i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir yap\u0131 sunmaktayd\u0131. Ancak, Signals'\u0131n Angular ekosistemine entegrasyonuyla birlikte, form y\u00f6netiminde de devrim niteli\u011finde yenilikler meydana geldi: <strong>Signal Forms<\/strong>. Peki, bu yeni yakla\u015f\u0131m neden standart reaktif formlardan daha iyi olarak kabul ediliyor ve geli\u015ftiricilere ne gibi avantajlar sunuyor?<\/p>\n<p>Geleneksel reaktif formlar, <code>FormControl<\/code>, <code>FormGroup<\/code> ve <code>FormArray<\/code> gibi soyutlamalarla \u00e7al\u0131\u015f\u0131r. Bu yap\u0131lar, RxJS obzervable'lar\u0131 (\u00f6zellikle <code>valueChanges<\/code> ve <code>statusChanges<\/code>) arac\u0131l\u0131\u011f\u0131yla formun durumunu izlememizi sa\u011flar. Bu yakla\u015f\u0131m g\u00fc\u00e7l\u00fc olsa da, \u00f6zellikle daha karma\u015f\u0131k senaryolarda baz\u0131 zorluklar ortaya \u00e7\u0131karabilir:<\/p>\n<ol>\n<li><strong>De\u011fi\u015fmezlik (Immutability) Y\u00f6netimi:<\/strong> Form de\u011ferlerinin manuel olarak g\u00fcncellenmesi veya d\u0131\u015far\u0131dan gelen verilerle birle\u015ftirilmesi gerekti\u011finde, de\u011fi\u015fmezli\u011fi korumak i\u00e7in genellikle spread operat\u00f6rleri veya immutable k\u00fct\u00fcphaneler kullanmak gerekirdi. Bu, kodun okunabilirli\u011fini ve karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131rabilirdi.<\/li>\n<li><strong>Abonelik Y\u00f6netimi:<\/strong> <code>valueChanges<\/code> veya <code>statusChanges<\/code> obzervable'lar\u0131na abone oldu\u011funuzda, memory leak'leri \u00f6nlemek i\u00e7in abonelikleri manuel olarak y\u00f6netmek (\u00f6rne\u011fin, <code>ngOnDestroy<\/code> i\u00e7inde <code>unsubscribe<\/code> etmek) zorunluydu. Bu, \u00f6zellikle \u00e7ok say\u0131da form alan\u0131yla u\u011fra\u015f\u0131rken yorucu olabilirdi.<\/li>\n<li><strong>Change Detection Tetikleyicileri:<\/strong> Zone.js tabanl\u0131 Change Detection, formdaki herhangi bir de\u011fi\u015fiklikte genellikle daha geni\u015f bir alan\u0131 kontrol ederdi, bu da gereksiz render i\u015flemlerine yol a\u00e7abilirdi.<\/li>\n<\/ol>\n<p><strong>Signal Forms<\/strong>, bu zorluklara Signal tabanl\u0131, daha modern ve verimli bir \u00e7\u00f6z\u00fcm sunar. Signal Forms'un temel felsefesi, formun t\u00fcm durumunu (de\u011fer, ge\u00e7erlilik, dokunulmu\u015fluk vb.) Signal'lar arac\u0131l\u0131\u011f\u0131yla y\u00f6netmektir. Bu, a\u015fa\u011f\u0131daki \u00f6nemli avantajlar\u0131 beraberinde getirir:<\/p>\n<ul>\n<li><strong>Do\u011fal Reaktivite ve Otomatik G\u00fcncellemeler:<\/strong> Signal Forms'daki t\u00fcm form kontrolleri (SignalFormControl, SignalFormGroup, SignalFormArray gibi), i\u00e7 de\u011ferlerini Signal olarak tutar. Bu sayede, bir form alan\u0131 de\u011fi\u015fti\u011finde, sadece ilgili k\u0131s\u0131mlar otomatik olarak g\u00fcncellenir ve bu Signal'\u0131 dinleyen bile\u015fenler veya <code>computed<\/code> de\u011ferler yeniden hesaplan\u0131r. Manuel abonelik y\u00f6netimine gerek kalmaz, \u00e7\u00fcnk\u00fc ba\u011f\u0131ml\u0131l\u0131klar Signal mekanizmas\u0131 taraf\u0131ndan otomatik olarak izlenir.<\/li>\n<li><strong>Daha Kolay De\u011fi\u015fmezlik:<\/strong> Signal Forms, de\u011fi\u015fmezli\u011fi (immutability) do\u011fal olarak destekler. Formun de\u011ferini de\u011fi\u015ftirdi\u011finizde, asl\u0131nda yeni bir Signal de\u011feri atam\u0131\u015f olursunuz. Bu, veri ak\u0131\u015f\u0131n\u0131 daha \u015feffaf hale getirir ve beklenmedik yan etkileri azalt\u0131r.<\/li>\n<li><strong>Gran\u00fcler Change Detection:<\/strong> Signals'\u0131n do\u011fas\u0131 gere\u011fi, formdaki bir de\u011fi\u015fiklik sadece ilgili Signal'lar\u0131 ve onlara ba\u011f\u0131ml\u0131 olan bile\u015fenleri tetikler. Bu, gereksiz render i\u015flemlerini ortadan kald\u0131r\u0131r ve uygulaman\u0131n genel performans\u0131n\u0131 art\u0131r\u0131r. \u00d6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k formlarda bu performans kazanc\u0131 \u00e7ok daha belirgin olur.<\/li>\n<li><strong>Daha Basit ve Okunabilir Kod:<\/strong> Abonelik y\u00f6netimi gibi boilerplate kodun ortadan kalkmas\u0131, form kodunu daha sade ve okunabilir hale getirir. Geli\u015ftiriciler, formun i\u015f mant\u0131\u011f\u0131na daha fazla odaklanabilir.<\/li>\n<\/ul>\n<p>Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, Signal Forms'un faydalar\u0131 \u00e7ok belirgindir. \u00d6rne\u011fin, bir \u00e7ok ad\u0131ml\u0131 anket uygulamas\u0131nda, her ad\u0131mda formun ge\u00e7erlili\u011fini dinamik olarak kontrol etmeniz ve sonraki ad\u0131ma ge\u00e7i\u015f d\u00fc\u011fmesini etkinle\u015ftirmeniz gerekebilir. Geleneksel formlarda, <code>statusChanges<\/code> obzervable'\u0131na abone olup ge\u00e7erlilik durumunu izlemek ve ard\u0131ndan aboneli\u011fi manuel olarak iptal etmek gerekirdi. Signal Forms ile, formun ge\u00e7erlilik durumunu tutan bir <code>computed<\/code> Signal olu\u015fturabilir ve bu <code>computed<\/code> Signal'\u0131 do\u011frudan d\u00fc\u011fme etkinle\u015ftirme mant\u0131\u011f\u0131nda kullanabilirsiniz. Bu hem daha az kod hem de daha az hata potansiyeli demektir.<\/p>\n<pre><code>\n  \/\/ Signal Forms ile basit bir \u00f6rnek\n  import { SignalFormControl, SignalFormGroup, Validators } from '@angular\/forms\/signals'; \/\/ Yeni import yolu\n\n  const loginForm = new SignalFormGroup({\n    email: new SignalFormControl('test@example.com', [Validators.required, Validators.email]),\n    password: new SignalFormControl('', [Validators.required, Validators.minLength(6)])\n  });\n\n  \/\/ Formun ge\u00e7erlili\u011fini otomatik olarak izleyen bir Signal\n  const isFormValid = loginForm.valid; \/\/ Bu bir Signal'd\u0131r!\n\n  \/\/ Bir bile\u015fen i\u00e7inde\n  \/\/ ngOnInit() {\n  \/\/   effect(() => {\n  \/\/     console.log('Form ge\u00e7erli mi:', isFormValid.value);\n  \/\/   });\n  \/\/ }\n<\/pre>\n<p><\/code><\/p>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, <code>isFormValid<\/code> do\u011frudan form grubunun ge\u00e7erlilik durumunu bir Signal olarak d\u00f6nd\u00fcr\u00fcyor. Bu Signal'\u0131, template'inizde veya ba\u015fka bir <code>effect<\/code> i\u00e7inde kullanabilirsiniz ve de\u011fi\u015fiklikler otomatik olarak yans\u0131r.<\/p>\n<p>K\u0131sacas\u0131, Signal Forms, Angular'da form y\u00f6netimini bir sonraki seviyeye ta\u015f\u0131yor. Daha do\u011fal reaktivite, daha iyi performans ve daha az boilerplate kod sunarak, geli\u015ftiricilerin daha verimli ve keyifli bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011fl\u0131yor. Bu ge\u00e7i\u015f, Angular'\u0131n gelecekteki form y\u00f6netim standartlar\u0131n\u0131 belirleyecek \u00f6nemli bir ad\u0131md\u0131r.<\/p>\n<h2>Ad\u0131m Ad\u0131m Migrasyon: Mevcut Formlar\u0131n\u0131z\u0131 Signal Forms'a Nas\u0131l D\u00f6n\u00fc\u015ft\u00fcr\u00fcrs\u00fcn\u00fcz?<\/h2>\n<p>Mevcut Angular projenizdeki reaktif formlar\u0131 Signal Forms'a d\u00f6n\u00fc\u015ft\u00fcrmek, ilk ba\u015fta karma\u015f\u0131k gibi g\u00f6r\u00fcnse de, Angular ekibi bu ge\u00e7i\u015fi m\u00fcmk\u00fcn oldu\u011funca p\u00fcr\u00fczs\u00fcz hale getirmek i\u00e7in ad\u0131mlar atm\u0131\u015ft\u0131r. Bu b\u00f6l\u00fcmde, mevcut formlar\u0131n\u0131z\u0131 Signal Forms'a nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m, kod \u00f6rnekleriyle birlikte inceleyece\u011fiz.<\/p>\n<p>\u00d6ncelikle, projenizin Angular v21'e g\u00fcncellendi\u011finden emin olmal\u0131s\u0131n\u0131z. E\u011fer hen\u00fcz yapmad\u0131ysan\u0131z, CLI kullanarak projenizi g\u00fcncelleyin:<\/p>\n<pre><code>\n  ng update @angular\/core @angular\/cli\n<\/pre>\n<p><\/code><\/p>\n<p>G\u00fcncelleme tamamland\u0131ktan sonra, mevcut <code>FormControl<\/code>, <code>FormGroup<\/code> ve <code>FormArray<\/code> yap\u0131lar\u0131n\u0131z\u0131 Signal tabanl\u0131 kar\u015f\u0131l\u0131klar\u0131yla de\u011fi\u015ftirmeye ba\u015flayabilirsiniz. Signal Forms API'si, geleneksel reaktif formlara \u00e7ok benzer bir yap\u0131ya sahiptir, bu da \u00f6\u011frenme e\u011frisini d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<h3>1. FormControl'den <code>signal()<\/code> Tabanl\u0131 Forma Ge\u00e7i\u015f<\/h3>\n<p>En temelden ba\u015flayal\u0131m: tek bir <code>FormControl<\/code>. Diyelim ki \u015f\u00f6yle bir <code>FormControl<\/code>'iniz var:<\/p>\n<pre><code>\n  \/\/ Eski Y\u00f6ntem\n  import { FormControl, Validators } from '@angular\/forms';\n\n  class OldFormComponent {\n    emailControl = new FormControl('eski@ornek.com', [Validators.required, Validators.email]);\n\n    onSubmit() {\n      console.log(this.emailControl.value);\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bunu Signal Forms'a d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in, <code>SignalFormControl<\/code>'\u00fc import etmeniz ve kullanman\u0131z yeterlidir:<\/p>\n<pre><code>\n  \/\/ Yeni Y\u00f6ntem (Signal Forms)\n  import { SignalFormControl, Validators } from '@angular\/forms\/signals'; \/\/ Yeni import yolu\n\n  class NewFormComponent {\n    emailControl = new SignalFormControl('yeni@ornek.com', [Validators.required, Validators.email]);\n\n    onSubmit() {\n      console.log(this.emailControl.value()); \/\/ Signal de\u011ferini okumak i\u00e7in () kullan\u0131l\u0131r\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>value<\/code> \u00f6zelli\u011fini okumak yerine, <code>value()<\/code> fonksiyonunu \u00e7a\u011f\u0131rman\u0131z gerekiyor. De\u011fer atamak i\u00e7inse <code>emailControl.setValue(&#039;yeni_deger&#039;)<\/code> yerine <code>emailControl.set(&#039;yeni_deger&#039;)<\/code> kullanabilirsiniz.<\/p>\n<h3>2. <code>FormGroup<\/code> ve <code>FormArray<\/code>'in Signal Forms Kar\u015f\u0131l\u0131klar\u0131<\/h3>\n<p><code>FormGroup<\/code> ve <code>FormArray<\/code> i\u00e7in de benzer bir mant\u0131k ge\u00e7erlidir. <code>SignalFormGroup<\/code> ve <code>SignalFormArray<\/code> import ederek mevcut yap\u0131lar\u0131n\u0131z\u0131 de\u011fi\u015ftirebilirsiniz.<\/p>\n<h4><code>FormGroup<\/code> Migrasyonu:<\/h4>\n<p>Mevcut bir <code>FormGroup<\/code> \u00f6rne\u011fi:<\/p>\n<pre><code>\n  \/\/ Eski Y\u00f6ntem\n  import { FormGroup, FormControl, Validators } from '@angular\/forms';\n\n  class OldUserForm {\n    userForm = new FormGroup({\n      firstName: new FormControl('', Validators.required),\n      lastName: new FormControl('', Validators.required),\n      age: new FormControl(18, [Validators.min(18), Validators.max(99)])\n    });\n\n    ngOnInit() {\n      this.userForm.valueChanges.subscribe(values => {\n        console.log('Form de\u011ferleri de\u011fi\u015fti:', values);\n      });\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Signal Forms'a d\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f hali:<\/p>\n<pre><code>\n  \/\/ Yeni Y\u00f6ntem (Signal Forms)\n  import { SignalFormGroup, SignalFormControl, Validators } from '@angular\/forms\/signals';\n  import { effect } from '@angular\/core';\n\n  class NewUserForm {\n    userForm = new SignalFormGroup({\n      firstName: new SignalFormControl('', Validators.required),\n      lastName: new SignalFormControl('', Validators.required),\n      age: new SignalFormControl(18, [Validators.min(18), Validators.max(99)])\n    });\n\n    constructor() {\n      \/\/ valueChanges yerine effect kullan\u0131yoruz\n      effect(() => {\n        console.log('Form de\u011ferleri de\u011fi\u015fti:', this.userForm.value());\n      });\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Burada en b\u00fcy\u00fck de\u011fi\u015fiklik, <code>valueChanges<\/code> Observable'\u0131na abone olmak yerine, <code>effect<\/code> kullanarak <code>userForm.value()<\/code> Signal'\u0131n\u0131 izlememizdir. Bu, abonelik y\u00f6netimini tamamen ortadan kald\u0131r\u0131r.<\/p>\n<h4><code>FormArray<\/code> Migrasyonu:<\/h4>\n<p>Dinamik olarak eklenen alanlar i\u00e7in <code>FormArray<\/code> kullan\u0131yorduk. \u015eimdi <code>SignalFormArray<\/code>'i kullanal\u0131m.<\/p>\n<pre><code>\n  \/\/ Eski Y\u00f6ntem\n  import { FormArray, FormGroup, FormControl, Validators } from '@angular\/forms';\n\n  class OldSkillsForm {\n    skillsForm = new FormGroup({\n      skills: new FormArray([\n        new FormControl('JavaScript', Validators.required)\n      ])\n    });\n\n    get skills(): FormArray {\n      return this.skillsForm.get('skills') as FormArray;\n    }\n\n    addSkill() {\n      this.skills.push(new FormControl('', Validators.required));\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Signal Forms'a d\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f hali:<\/p>\n<pre><code>\n  \/\/ Yeni Y\u00f6ntem (Signal Forms)\n  import { SignalFormArray, SignalFormGroup, SignalFormControl, Validators } from '@angular\/forms\/signals';\n\n  class NewSkillsForm {\n    skillsForm = new SignalFormGroup({\n      skills: new SignalFormArray([\n        new SignalFormControl('JavaScript', Validators.required)\n      ])\n    });\n\n    get skills(): SignalFormArray { \/\/ D\u00f6n\u00fc\u015f tipi de de\u011fi\u015fir\n      return this.skillsForm.get('skills') as SignalFormArray;\n    }\n\n    addSkill() {\n      this.skills.push(new SignalFormControl('', Validators.required));\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Yine, yap\u0131sal olarak \u00e7ok b\u00fcy\u00fck bir fark yok. <code>FormArray<\/code> yerine <code>SignalFormArray<\/code> kullan\u0131yor ve <code>skills<\/code> getter'\u0131n\u0131n d\u00f6n\u00fc\u015f tipini g\u00fcncelliyoruz. \u0130\u015flemler (<code>push<\/code>, <code>removeAt<\/code> vb.) ayn\u0131 kal\u0131r.<\/p>\n<h3>3. Validasyon (Do\u011frulama) Stratejileri<\/h3>\n<p>Validasyonlar, Signal Forms'da da ayn\u0131 \u015fekilde <code>Validators<\/code> mod\u00fcl\u00fc kullan\u0131larak tan\u0131mlan\u0131r. Ancak, formun ge\u00e7erlilik durumunu izlemek i\u00e7in Signal'lar\u0131 kullan\u0131rs\u0131n\u0131z.<\/p>\n<pre><code>\n  import { SignalFormGroup, SignalFormControl, Validators } from '@angular\/forms\/signals';\n  import { effect } from '@angular\/core';\n\n  class RegistrationForm {\n    registrationForm = new SignalFormGroup({\n      username: new SignalFormControl('', [Validators.required, Validators.minLength(3)]),\n      email: new SignalFormControl('', [Validators.required, Validators.email]),\n    });\n\n    constructor() {\n      \/\/ Formun genel ge\u00e7erlilik durumunu izlemek i\u00e7in\n      effect(() => {\n        console.log('Form ge\u00e7erli mi:', this.registrationForm.valid());\n        if (!this.registrationForm.valid()) {\n          console.log('Hatalar:', this.registrationForm.errors());\n        }\n      });\n\n      \/\/ Tek bir kontrol\u00fcn ge\u00e7erlilik durumunu izlemek i\u00e7in\n      effect(() => {\n        console.log('Kullan\u0131c\u0131 ad\u0131 ge\u00e7erli mi:', this.registrationForm.controls.username.valid());\n      });\n    }\n\n    onSubmit() {\n      if (this.registrationForm.valid()) {\n        console.log('Form g\u00f6nderildi:', this.registrationForm.value());\n      } else {\n        console.log('Form hatal\u0131, l\u00fctfen d\u00fczeltin.');\n      }\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>registrationForm.valid()<\/code> ve <code>registrationForm.controls.username.valid()<\/code> gibi ifadeler, formun veya kontrol\u00fcn ge\u00e7erlilik durumunu bir Signal olarak verir. Bu sayede, UI'da dinamik olarak hata mesajlar\u0131 g\u00f6stermek veya bir submit d\u00fc\u011fmesini etkinle\u015ftirmek \u00e7ok daha kolay ve reaktif hale gelir.<\/p>\n<blockquote>\n<p>Vaka Analizi: Bir Kullan\u0131c\u0131 Kay\u0131t Formunun Signal Forms'a Migrasyonu<\/p>\n<p>Eski bir web uygulamas\u0131nda, kullan\u0131c\u0131 kay\u0131t formu (<code>SignUpComponent<\/code>) geleneksel reaktif formlar kullan\u0131yordu. Formda kullan\u0131c\u0131 ad\u0131, e-posta, \u015fifre ve \u015fifre onay\u0131 alanlar\u0131 vard\u0131. \u015eifrelerin e\u015fle\u015fti\u011fini kontrol eden \u00f6zel bir validat\u00f6r de bulunuyordu. Migrasyon s\u00fcrecinde at\u0131lan ad\u0131mlar:<\/p>\n<ol>\n<li>T\u00fcm <code>FormControl<\/code>, <code>FormGroup<\/code> importlar\u0131 <code>@angular\/forms\/signals<\/code> yolundaki <code>SignalFormControl<\/code>, <code>SignalFormGroup<\/code> ile de\u011fi\u015ftirildi.<\/li>\n<li><code>SignUpComponent<\/code>'in <code>ngOnInit<\/code> metodunda bulunan <code>form.valueChanges.subscribe(...)<\/code> \u00e7a\u011fr\u0131lar\u0131, bile\u015fenin <code>constructor<\/code>'\u0131 i\u00e7inde <code>effect(() => { ... })<\/code> bloklar\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc. Bu, abonelik y\u00f6netimini ortadan kald\u0131rd\u0131.<\/li>\n<li>\u00d6zel validat\u00f6r fonksiyonu, Signal Forms ile uyumlu olacak \u015fekilde k\u00fc\u00e7\u00fck bir de\u011fi\u015fiklikle kald\u0131. Validat\u00f6rlerin return de\u011feri hala ayn\u0131 yap\u0131da kald\u0131.<\/li>\n<li>Template dosyalar\u0131nda, form kontrol de\u011ferlerini okurken <code>control.value<\/code> yerine <code>control.value()<\/code> kullan\u0131ld\u0131. Ayn\u0131 \u015fekilde, <code>form.valid<\/code> yerine <code>form.valid()<\/code> gibi Signal okuma \u00e7a\u011fr\u0131lar\u0131 eklendi.<\/li>\n<\/ol>\n<p>Sonu\u00e7: Formun performans\u0131, \u00f6zellikle karma\u015f\u0131k validasyonlar ve dinamik alan g\u00fcncellemelerinde g\u00f6zle g\u00f6r\u00fcl\u00fcr \u015fekilde artt\u0131. Kod, abonelik y\u00f6netiminden kurtuldu\u011fu i\u00e7in daha sade ve okunabilir hale geldi.<\/p>\n<\/blockquote>\n<p>Genel olarak, migrasyon s\u00fcreci, mevcut kod yap\u0131n\u0131za ve formlar\u0131n\u0131z\u0131n karma\u015f\u0131kl\u0131\u011f\u0131na ba\u011fl\u0131 olarak de\u011fi\u015fecektir. Ancak, temel prensip, RxJS tabanl\u0131 reaktif form API'lerini Signal tabanl\u0131 muadilleriyle de\u011fi\u015ftirmek ve reaksiyonlar i\u00e7in <code>effect<\/code> veya <code>computed<\/code> kullanmakt\u0131r. Bu ad\u0131mlar\u0131 dikkatlice takip ederek, projenizi modern Angular v21'in sundu\u011fu Signal Forms avantajlar\u0131ndan faydalanacak \u015fekilde d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.<\/p>\n<h2>Signal Forms'u \u0130leri D\u00fczeyde Kullan\u0131m: Performans \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h2>\n<p>Angular Signal Forms, form y\u00f6netimini basitle\u015ftirmenin yan\u0131 s\u0131ra, \u00f6zellikle performans ve esneklik konusunda ileri d\u00fczey kullan\u0131m senaryolar\u0131 i\u00e7in de g\u00fc\u00e7l\u00fc imkanlar sunar. Bu b\u00f6l\u00fcmde, Signal Forms'un potansiyelini tam olarak ortaya \u00e7\u0131karacak ipu\u00e7lar\u0131n\u0131 ve en iyi uygulamalar\u0131 inceleyece\u011fiz, b\u00f6ylece karma\u015f\u0131k formlar\u0131 bile optimize edilmi\u015f ve s\u00fcrd\u00fcr\u00fclebilir bir \u015fekilde y\u00f6netebilirsiniz.<\/p>\n<h3>1. Karma\u015f\u0131k Senaryolarda <code>computed<\/code> ve <code>effect<\/code> Kullan\u0131m\u0131<\/h3>\n<p>Signal Forms ile \u00e7al\u0131\u015f\u0131rken, <code>computed<\/code> ve <code>effect<\/code> fonksiyonlar\u0131, form mant\u0131\u011f\u0131n\u0131z\u0131 daha mod\u00fcler ve reaktif hale getirmek i\u00e7in vazge\u00e7ilmez ara\u00e7lard\u0131r. \u00d6zellikle dinamik olarak de\u011fi\u015fen alanlar, asenkron validasyonlar veya formun genel durumuna g\u00f6re UI g\u00fcncellemeleri gibi senaryolarda bu ara\u00e7lar\u0131 etkin bir \u015fekilde kullanabilirsiniz.<\/p>\n<p><strong>Dinamik Alan Etkinle\u015ftirme\/Devre D\u0131\u015f\u0131 B\u0131rakma:<\/strong> Bir kullan\u0131c\u0131 bir onay kutusunu i\u015faretledi\u011finde belirli bir alan\u0131n g\u00f6r\u00fcn\u00fcr veya d\u00fczenlenebilir hale gelmesi gibi durumlarda <code>computed<\/code> Signal'lar devreye girer. \u00d6rne\u011fin:<\/p>\n<pre><code>\n  import { SignalFormGroup, SignalFormControl, Validators } from '@angular\/forms\/signals';\n  import { computed, effect } from '@angular\/core';\n\n  class PaymentForm {\n    paymentForm = new SignalFormGroup({\n      paymentMethod: new SignalFormControl('creditCard'),\n      cardNumber: new SignalFormControl('', Validators.required),\n      paypalEmail: new SignalFormControl('', [Validators.required, Validators.email]),\n    });\n\n    constructor() {\n      \/\/ \u00d6deme y\u00f6ntemi de\u011fi\u015ftik\u00e7e alanlar\u0131 dinamik olarak etkinle\u015ftir\/devre d\u0131\u015f\u0131 b\u0131rak\n      effect(() => {\n        if (this.paymentForm.controls.paymentMethod.value() === 'creditCard') {\n          this.paymentForm.controls.cardNumber.enable();\n          this.paymentForm.controls.paypalEmail.disable();\n          this.paymentForm.controls.paypalEmail.set(''); \/\/ De\u011feri s\u0131f\u0131rla\n        } else if (this.paymentForm.controls.paymentMethod.value() === 'paypal') {\n          this.paymentForm.controls.cardNumber.disable();\n          this.paymentForm.controls.cardNumber.set(''); \/\/ De\u011feri s\u0131f\u0131rla\n          this.paymentForm.controls.paypalEmail.enable();\n        }\n      });\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>effect<\/code> kullanarak <code>paymentMethod<\/code> Signal'\u0131ndaki de\u011fi\u015fiklikleri izliyor ve buna g\u00f6re ilgili form kontrollerini etkinle\u015ftirip devre d\u0131\u015f\u0131 b\u0131rak\u0131yoruz. Bu, daha temiz ve deklaratif bir yakla\u015f\u0131m sunar.<\/p>\n<h3>2. Asenkron Validasyonlar<\/h3>\n<p>Asenkron validasyonlar (\u00f6rne\u011fin, bir kullan\u0131c\u0131 ad\u0131n\u0131n veritaban\u0131nda zaten olup olmad\u0131\u011f\u0131n\u0131 kontrol etme), geleneksel reaktif formlarda Observable'lar ile y\u00f6netilirdi. Signal Forms'da ise yine <code>effect<\/code> ve <code>computed<\/code> kombinasyonunu kullanarak bu i\u015flemi daha entegre bir \u015fekilde yapabiliriz.<\/p>\n<pre><code>\n  import { SignalFormControl, Validators } from '@angular\/forms\/signals';\n  import { signal, effect } from '@angular\/core';\n  import { debounceTime, switchMap, of } from 'rxjs'; \/\/ RxJS hala kullan\u0131labilir\n\n  function uniqueUsernameValidator(control: SignalFormControl<string>) {\n    \/\/ API \u00e7a\u011fr\u0131s\u0131 sim\u00fclasyonu\n    return new Promise(resolve => {\n      setTimeout(() => {\n        const takenUsernames = ['admin', 'user123'];\n        if (takenUsernames.includes(control.value())) {\n          resolve({ uniqueUsername: true });\n        } else {\n          resolve(null);\n        }\n      }, 500);\n    });\n  }\n\n  class UsernameControl {\n    username = new SignalFormControl('', { asyncValidators: [uniqueUsernameValidator] });\n    usernameStatus = signal('pending'); \/\/ 'pending', 'valid', 'invalid'\n\n    constructor() {\n      effect(() => {\n        \/\/ Kontrol\u00fcn durumu de\u011fi\u015ftik\u00e7e usernameStatus'u g\u00fcncelle\n        \/\/ Asenkron validasyonlar i\u00e7in \u00f6zel bir durum y\u00f6netimi gerekebilir\n        \/\/ Angular forms asyncValidators k\u0131sm\u0131 hen\u00fcz tam olarak signals ile entegre olmayabilir,\n        \/\/ bu y\u00fczden ge\u00e7ici durumlar manuel y\u00f6netilebilir.\n        console.log('Username durumu:', this.username.status());\n        this.usernameStatus.set(this.username.status());\n      });\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>asyncValidators<\/code>'lar hala Promise veya Observable d\u00f6nd\u00fcrebilir. Signal Forms, bu asenkron validasyonlar\u0131 entegre eder ve <code>control.status()<\/code> Signal'\u0131 arac\u0131l\u0131\u011f\u0131yla durumunu g\u00fcnceller. <code>effect<\/code> kullanarak bu durumu izleyip UI'\u0131 g\u00fcncelleyebilirsiniz.<\/p>\n<h3>3. Form Bile\u015fenlerinin Yeniden Kullan\u0131labilirli\u011fi<\/h3>\n<p>Signal Forms ile, daha \u00f6nce oldu\u011fu gibi, karma\u015f\u0131k formlar\u0131 k\u00fc\u00e7\u00fck, yeniden kullan\u0131labilir bile\u015fenlere ay\u0131rmak \u00e7ok daha kolayd\u0131r. Her alt bile\u015fen kendi <code>SignalFormGroup<\/code> veya <code>SignalFormControl<\/code>'\u00fcn\u00fc y\u00f6netebilir ve <code>Input<\/code>\/<code>Output<\/code> veya Signal tabanl\u0131 yakla\u015f\u0131mlarla \u00fcst bile\u015fenle ileti\u015fim kurabilir.<\/p>\n<pre><code>\n  \/\/ child-address-form.component.ts\n  import { Component, Input } from '@angular\/core';\n  import { SignalFormGroup, SignalFormControl, Validators } from '@angular\/forms\/signals';\n\n  @Component({\n    selector: 'app-address-form',\n    template: <code><div [formGroup]=\"addressForm\">\n        <input type=\"text\" formControlName=\"street\" placeholder=\"Sokak\">\n        <input type=\"text\" formControlName=\"city\" placeholder=\"\u015eehir\">\n      <\/div><\/code>,\n    standalone: true,\n    imports: [ReactiveFormsModule] \/\/ ReactiveFormsModule hala gereklidir\n  })\n  export class AddressFormComponent {\n    @Input() addressForm!: SignalFormGroup<{ street: SignalFormControl<string>, city: SignalFormControl<string> }>;\n\n    constructor() {\n      if (!this.addressForm) {\n        this.addressForm = new SignalFormGroup({\n          street: new SignalFormControl('', Validators.required),\n          city: new SignalFormControl('', Validators.required)\n        });\n      }\n    }\n  }\n\n  \/\/ parent-user-profile.component.ts\n  import { Component } from '@angular\/core';\n  import { SignalFormGroup, SignalFormControl } from '@angular\/forms\/signals';\n  import { AddressFormComponent } from '.\/child-address-form.component';\n\n  @Component({\n    selector: 'app-user-profile',\n    template: <code><form [formGroup]=\"userProfileForm\">\n        <input type=\"text\" formControlName=\"name\">\n        <app-address-form [addressForm]=\"userProfileForm.controls.address\"><\/app-address-form>\n        <button [disabled]=\"!userProfileForm.valid()\">Kaydet<\/button>\n      <\/form><\/code>,\n    standalone: true,\n    imports: [ReactiveFormsModule, AddressFormComponent]\n  })\n  export class UserProfileComponent {\n    userProfileForm = new SignalFormGroup({\n      name: new SignalFormControl(''),\n      address: new SignalFormGroup({\n        street: new SignalFormControl(''),\n        city: new SignalFormControl('')\n      })\n    });\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>AddressFormComponent<\/code>, kendi <code>SignalFormGroup<\/code>'unu <code>Input<\/code> olarak alarak, formun bir par\u00e7as\u0131n\u0131 y\u00f6netir. \u00dcst bile\u015fen, <code>userProfileForm.controls.address<\/code> SignalFormGroup'u alt bile\u015fene aktar\u0131r. Bu, formlar\u0131n par\u00e7alanabilirli\u011fini ve yeniden kullan\u0131labilirli\u011fini art\u0131r\u0131r.<\/p>\n<h3>4. State Y\u00f6netimi Entegrasyonu (NgRx\/Pinia ile)<\/h3>\n<p>Signal Forms, durum y\u00f6netimi k\u00fct\u00fcphaneleriyle (NgRx, Akita, Pinia gibi) sorunsuz bir \u015fekilde entegre edilebilir. Form de\u011ferlerini Signal olarak al\u0131p, bir <code>effect<\/code> kullanarak bunlar\u0131 store'a g\u00f6nderebilirsiniz. Ayn\u0131 \u015fekilde, store'daki de\u011fi\u015fiklikleri dinleyip form kontrollerini g\u00fcncelleyebilirsiniz. Bu entegrasyon, uygulaman\u0131n global durumunu daha tutarl\u0131 hale getirir.<\/p>\n<pre><code>\n  \/\/ NgRx ile \u00f6rnek entegrasyon (basitle\u015ftirilmi\u015f)\n  import { SignalFormGroup, SignalFormControl } from '@angular\/forms\/signals';\n  import { effect } from '@angular\/core';\n  import { Store } from '@ngrx\/store';\n  import { updateUserProfile } from '.\/store\/actions'; \/\/ Varsay\u0131msal NgRx action\n\n  class UserProfileContainer {\n    userProfileForm = new SignalFormGroup({\n      name: new SignalFormControl(''),\n      email: new SignalFormControl('')\n    });\n\n    constructor(private store: Store<any>) {\n      \/\/ Form de\u011ferleri de\u011fi\u015fti\u011finde store'a g\u00f6nder\n      effect(() => {\n        if (this.userProfileForm.valid()) {\n          \/\/ store.dispatch(updateUserProfile({ user: this.userProfileForm.value() }));\n          console.log('Store g\u00fcncellendi:', this.userProfileForm.value());\n        }\n      });\n\n      \/\/ Store'dan gelen de\u011ferlerle formu doldur (\u00f6rne\u011fin ngOnInit i\u00e7inde)\n      \/\/ this.store.select(selectUserProfile).subscribe(user => {\n      \/\/   this.userProfileForm.controls.name.set(user.name);\n      \/\/   this.userProfileForm.controls.email.set(user.email);\n      \/\/ });\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu entegrasyonlar, Angular'\u0131n gelecekteki duruma y\u00f6nelimi ile uyumlu olup, geli\u015ftiricilere daha tutarl\u0131 ve reaktif bir deneyim sunar.<\/p>\n<h2>V21 Migrasyon S\u00fcrecinde Kar\u015f\u0131la\u015fabilece\u011finiz Zorluklar ve \u00c7\u00f6z\u00fcmleri Nelerdir?<\/h2>\n<p>Angular v21'e ge\u00e7i\u015f, b\u00fcy\u00fck \u00f6l\u00e7\u00fcde otomatize edilmi\u015f olsa da, her migrasyon s\u00fcrecinde oldu\u011fu gibi belirli zorluklar ve \"breaking changes\" ile kar\u015f\u0131la\u015fmak m\u00fcmk\u00fcnd\u00fcr. \u00d6zellikle b\u00fcy\u00fck, eski veya \u00e7ok say\u0131da \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanesi kullanan projelerde bu zorluklar daha belirgin hale gelebilir. Ancak do\u011fru haz\u0131rl\u0131k ve stratejiyle bu sorunlar\u0131n \u00fcstesinden gelmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h3>1. Breaking Changes ve Ba\u011f\u0131ml\u0131l\u0131k Uyu\u015fmazl\u0131klar\u0131<\/h3>\n<p>Her b\u00fcy\u00fck Angular s\u00fcr\u00fcm\u00fcyle birlikte, baz\u0131 API'ler kullan\u0131mdan kald\u0131r\u0131labilir (deprecated) veya tamamen kald\u0131r\u0131labilir. Bu, mevcut kodunuzun yeni s\u00fcr\u00fcmle uyumsuz hale gelmesine neden olabilir.\n<\/p>\n<pre><code>\n  \/\/ Olas\u0131 bir deprecation \u00f6rne\u011fi: Eski bir Router API'si\n  \/\/ Eski: router.navigateByUrl('\/home');\n  \/\/ Yeni: router.navigate(['\/home']);\n  \/\/ Signal Forms \u00f6zelinde:\n  \/\/ FormControl.valueChanges.subscribe() => effect(() => formControl.value())\n<\/pre>\n<p><\/code><\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> Angular CLI'nin <code>ng update<\/code> komutu, \u00e7o\u011fu breaking change i\u00e7in otomatik d\u00fczeltmeler sa\u011flar. G\u00fcncelleme sonras\u0131 CLI'n\u0131n \u00f6nerdi\u011fi ad\u0131mlar\u0131 dikkatlice okuyun. E\u011fer bir sorunla kar\u015f\u0131la\u015f\u0131rsan\u0131z, Angular g\u00fcncelleyici (updater) veya resmi Angular blogundaki migrasyon k\u0131lavuzlar\u0131n\u0131 kontrol edin. \u00dc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphaneler i\u00e7in, k\u00fct\u00fcphanelerin kendi Angular v21 uyumluluk s\u00fcr\u00fcmlerini beklemek veya alternatif k\u00fct\u00fcphaneler aramak gerekebilir. <code>package.json<\/code> dosyas\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 g\u00fcncelledikten sonra <code>npm install<\/code> veya <code>yarn install<\/code> komutlar\u0131n\u0131 tekrar \u00e7al\u0131\u015ft\u0131r\u0131n.<\/p>\n<h3>2. Eski K\u00fct\u00fcphanelerle Uyumsuzluk<\/h3>\n<p>\u00d6zellikle Angular i\u00e7in geli\u015ftirilmi\u015f ancak uzun s\u00fcredir g\u00fcncellenmeyen baz\u0131 \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphaneler, yeni Angular s\u00fcr\u00fcmleriyle uyumsuzluk g\u00f6sterebilir. Bu durum, \u00f6zellikle k\u00fct\u00fcphane i\u00e7indeki dahili Change Detection mekanizmalar\u0131na veya ya\u015fam d\u00f6ng\u00fcs\u00fc hook'lar\u0131na dayan\u0131yorsa daha belirgin olabilir.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> Migrasyona ba\u015flamadan \u00f6nce, projenizin kulland\u0131\u011f\u0131 t\u00fcm \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerin Angular v21 uyumlulu\u011funu kontrol edin. K\u00fct\u00fcphanelerin GitHub sayfalar\u0131n\u0131 veya resmi belgelerini inceleyin. E\u011fer bir k\u00fct\u00fcphane uyumlu de\u011filse, alternatif bir k\u00fct\u00fcphane bulmay\u0131 veya k\u00fct\u00fcphanenin g\u00fcncellenmesini beklemeyi d\u00fc\u015f\u00fcnebilirsiniz. Baz\u0131 durumlarda, uyumsuz k\u00fct\u00fcphanenin sorunlu k\u0131s\u0131mlar\u0131n\u0131 kendi kodunuzla yamalamak veya ge\u00e7ici \u00e7\u00f6z\u00fcmler \u00fcretmek de gerekebilir, ancak bu, teknik borcu art\u0131rabilir.<\/p>\n<h3>3. Test Stratejileri ve <code>Karma<\/code>\/<code>Jasmine<\/code> G\u00fcncellemeleri<\/h3>\n<p>Angular v21'e ge\u00e7i\u015f, test ortam\u0131n\u0131zda da de\u011fi\u015fiklikler gerektirebilir. <code>Karma<\/code>, <code>Jasmine<\/code> veya <code>Jest<\/code> gibi test k\u00fct\u00fcphanelerinin Angular v21 ile uyumlu s\u00fcr\u00fcmlerinin kullan\u0131ld\u0131\u011f\u0131ndan emin olman\u0131z gerekir. \u00d6zellikle Signal Forms'a ge\u00e7i\u015f yaparken, form de\u011ferlerini ve durumunu Signal API'si (<code>.value()<\/code>, <code>.valid()<\/code> vb.) \u00fczerinden okudu\u011funuz i\u00e7in test kodlar\u0131n\u0131zda da bu de\u011fi\u015fiklikleri yans\u0131tman\u0131z gerekecektir.<\/p>\n<pre><code>\n  \/\/ Signal Forms i\u00e7in test \u00f6rne\u011fi\n  import { SignalFormGroup, SignalFormControl, Validators } from '@angular\/forms\/signals';\n\n  \/\/ Component testinde:\n  it('should enable submit button when form is valid', () => {\n    component.loginForm = new SignalFormGroup({\n      email: new SignalFormControl('test@example.com', [Validators.required, Validators.email]),\n      password: new SignalFormControl('password', Validators.required)\n    });\n    fixture.detectChanges(); \/\/ De\u011fi\u015fiklikleri tetikle\n    expect(component.loginForm.valid()).toBeTrue(); \/\/ .valid() Signal'\u0131n\u0131 kontrol et\n    \/\/ expect(fixture.nativeElement.querySelector('button').disabled).toBeFalse();\n  });\n<\/pre>\n<p><\/code><\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> Testlerinizi g\u00fcncellemeden \u00f6nce, t\u00fcm test ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131n (\u00f6rne\u011fin, <code>@angular\/platform-browser-dynamic\/testing<\/code>) Angular v21 ile uyumlu oldu\u011fundan emin olun. Signal Forms kullanan bile\u015fenlerinizi test ederken, form kontrollerinin de\u011ferlerini ve durumlar\u0131n\u0131 okumak i\u00e7in Signal API'sini (<code>.value()<\/code>, <code>.valid()<\/code>) kulland\u0131\u011f\u0131n\u0131zdan emin olun. E\u011fer mevcut testleriniz failing olmaya ba\u015flarsa, hata mesajlar\u0131n\u0131 dikkatlice inceleyerek sorunun kayna\u011f\u0131n\u0131 tespit edin.<\/p>\n<h3>4. Debugging \u0130pu\u00e7lar\u0131<\/h3>\n<p>Yeni bir s\u00fcr\u00fcme ge\u00e7i\u015f yapt\u0131ktan sonra veya Signal Forms kullanmaya ba\u015flad\u0131\u011f\u0131n\u0131zda, beklenmedik davran\u0131\u015flarla kar\u015f\u0131la\u015fabilirsiniz. Debugging, bu t\u00fcr durumlarda hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong><\/p>\n<ul>\n<li><strong>Taray\u0131c\u0131 Geli\u015ftirici Ara\u00e7lar\u0131:<\/strong> Taray\u0131c\u0131n\u0131z\u0131n geli\u015ftirici ara\u00e7lar\u0131ndaki Console ve Network sekmesini aktif olarak kullan\u0131n. Signal'lar console'da do\u011frudan okunabilir, bu da durumlar\u0131n\u0131 izlemeyi kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Angular DevTools:<\/strong> Angular DevTools uzant\u0131s\u0131, bile\u015fen hiyerar\u015fisini, Change Detection d\u00f6ng\u00fclerini ve performans darbo\u011fazlar\u0131n\u0131 g\u00f6rselle\u015ftirmek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. \u00d6zellikle Signals'\u0131n nas\u0131l tetiklendi\u011fini anlamak i\u00e7in bu ara\u00e7 \u00e7ok yard\u0131mc\u0131 olabilir.<\/li>\n<li><strong><code>effect<\/code> Kullan\u0131m\u0131:<\/strong> Baz\u0131 durumlarda, bir Signal'\u0131n neden veya ne zaman de\u011fi\u015fti\u011fini anlamak i\u00e7in ge\u00e7ici olarak <code>effect<\/code> bloklar\u0131 ekleyip loglama yapabilirsiniz.<\/li>\n<pre><code>\n      effect(() => {\n        console.log('Bu Signal de\u011fi\u015fti:', someSignal.value());\n      }, { allowSignalWrites: true }); \/\/ Yan etkileri g\u00f6zlemlemek i\u00e7in\n    <\/pre>\n<p><\/code><\/p>\n<li><strong>K\u00fc\u00e7\u00fck Ad\u0131mlarla \u0130lerleme:<\/strong> Karma\u015f\u0131k bir projeyi tek seferde tamamen g\u00fcncellemek yerine, b\u00f6l\u00fcm b\u00f6l\u00fcm veya form form ilerlemek, potansiyel sorunlar\u0131 daha erken tespit etmenizi sa\u011flar.<\/li>\n<\/ul>\n<p>Angular v21'e migrasyon s\u00fcreci, do\u011fru yakla\u015f\u0131mla y\u00f6netildi\u011finde projenizin performans\u0131n\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131racak de\u011ferli bir ad\u0131md\u0131r. Kar\u015f\u0131la\u015fabilece\u011finiz zorluklar\u0131n fark\u0131nda olmak ve proaktif \u00e7\u00f6z\u00fcmler \u00fcretmek, bu ge\u00e7i\u015fi \u00e7ok daha sorunsuz hale getirecektir.<\/p>\n<h2>Sonu\u00e7: Angular'\u0131n Gelece\u011fi ve Signal Forms'un Yeri<\/h2>\n<p>Angular v21, web geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, verimlilik ve geli\u015ftirici deneyimini bir \u00fcst seviyeye ta\u015f\u0131yan \u00f6nemli bir kilometre ta\u015f\u0131d\u0131r. Bu s\u00fcr\u00fcmle birlikte tan\u0131t\u0131lan <strong>Signal Forms<\/strong> ve Signals tabanl\u0131 reaktivite, Angular'\u0131n gelecekteki form y\u00f6netimi ve durum y\u00f6netimi standartlar\u0131n\u0131 belirleyecek anahtar bir \u00f6zelliktir. Manuel abonelik y\u00f6netiminin azalmas\u0131, daha gran\u00fcler Change Detection ve do\u011fal de\u011fi\u015fmezlik (immutability) deste\u011fi, geli\u015ftiricilere daha temiz, daha performansl\u0131 ve daha az hataya a\u00e7\u0131k kod yazma imkan\u0131 sunmaktad\u0131r. Eski reaktif formlardan Signal Forms'a ge\u00e7i\u015f, do\u011fru ad\u0131mlarla ve dikkatli bir planlamayla kolayca ger\u00e7ekle\u015ftirilebilir ve uygulaman\u0131za \u00f6nemli avantajlar sa\u011flayabilir.<\/p>\n<p>Angular ekibinin Signals \u00fczerindeki \u00e7al\u0131\u015fmalar\u0131, \u00e7er\u00e7evenin genel performans\u0131n\u0131 ve geli\u015ftirici verimlili\u011fini art\u0131rmaya y\u00f6nelik uzun vadeli vizyonunun bir par\u00e7as\u0131d\u0131r. Signal Forms, bu vizyonun somut bir \u00f6rne\u011fidir ve Angular'\u0131n modern web uygulama geli\u015ftirme ara\u00e7lar\u0131 aras\u0131ndaki yerini sa\u011flamla\u015ft\u0131r\u0131r. Bu g\u00fc\u00e7l\u00fc \u00f6zellikler sayesinde, Angular geli\u015ftiricileri, kullan\u0131c\u0131 dostu ve y\u00fcksek performansl\u0131 uygulamalar olu\u015fturmaya daha fazla odaklanabilirler. Unutmay\u0131n, modern web geli\u015ftirmenin s\u00fcrekli evrildi\u011fi bir ortamda, g\u00fcncel kalmak ve yeni teknolojileri benimsemek, hem projelerinizin hem de kendi kariyerinizin ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir. Angular v21 ve Signal Forms, bu yolculukta size e\u015flik edecek g\u00fc\u00e7l\u00fc m\u00fcttefiklerdir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>1. Angular v21'e ge\u00e7i\u015f yapmak zorunlu mu? Eski reaktif formlar\u0131 kullanmaya devam edebilir miyim?<\/h4>\n<p><strong>Cevap:<\/strong> Angular v21'e ge\u00e7i\u015f zorunlu de\u011fildir, ancak \u015fiddetle tavsiye edilir. Eski reaktif formlar\u0131 kullanmaya devam edebilirsiniz, ancak Signal Forms'un getirdi\u011fi performans, okunabilirlik ve bak\u0131m kolayl\u0131\u011f\u0131 gibi avantajlardan mahrum kal\u0131rs\u0131n\u0131z. Yeni \u00f6zelliklerden ve gelecekteki optimizasyonlardan faydalanmak i\u00e7in kademeli olarak Signal Forms'a ge\u00e7i\u015f yapman\u0131z \u00f6nerilir.<\/p>\n<h4>2. Signal Forms, RxJS'in yerini mi al\u0131yor? Projelerimde art\u0131k RxJS kullanmayacak m\u0131y\u0131m?<\/h4>\n<p><strong>Cevap:<\/strong> Hay\u0131r, Signal Forms, RxJS'in yerini alm\u0131yor. Signals ve RxJS, farkl\u0131 ancak birbirini tamamlay\u0131c\u0131 reaktif programlama paradigmalar\u0131d\u0131r. Signals, daha \u00e7ok uygulaman\u0131n dahili durumunu ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmek i\u00e7in tasarlanm\u0131\u015ft\u0131r, Reactive Forms'daki abonelik y\u00f6netimi gibi boilerplate kodlar\u0131 azalt\u0131r. RxJS ise hala asenkron olay ak\u0131\u015flar\u0131n\u0131, veri d\u00f6n\u00fc\u015f\u00fcmlerini ve karma\u015f\u0131k zamanlama senaryolar\u0131n\u0131 y\u00f6netmek i\u00e7in Angular'da ve genel JavaScript ekosisteminde g\u00fc\u00e7l\u00fc bir ara\u00e7 olmaya devam edecektir. Her ikisini birlikte etkin bir \u015fekilde kullanabilirsiniz.<\/p>\n<h4>3. Signal Forms kullan\u0131rken performans avantajlar\u0131n\u0131 nas\u0131l g\u00f6zlemleyebilirim?<\/h4>\n<p><strong>Cevap:<\/strong> Signal Forms'un performans avantajlar\u0131, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k formlarda, \u00e7ok say\u0131da dinamik alan\u0131 olan uygulamalarda veya s\u0131k g\u00fcncellenen verilerle \u00e7al\u0131\u015fan bile\u015fenlerde daha belirgin olacakt\u0131r. Taray\u0131c\u0131n\u0131z\u0131n performans analiz ara\u00e7lar\u0131n\u0131 (\u00f6rne\u011fin, Chrome DevTools'daki Performance sekmesi) kullanarak, Change Detection d\u00f6ng\u00fclerinin say\u0131s\u0131n\u0131 ve s\u00fcresini g\u00f6zlemleyebilirsiniz. Signal Forms ile, gereksiz yeniden render i\u015flemlerinin azald\u0131\u011f\u0131n\u0131 ve uygulaman\u0131z\u0131n daha az CPU ve bellek kulland\u0131\u011f\u0131n\u0131 fark edeceksiniz.<\/p>\n<h4>4. Mevcut bir projeyi Signal Forms'a d\u00f6n\u00fc\u015ft\u00fcrme s\u00fcreci ne kadar s\u00fcrer?<\/h4>\n<p><strong>Cevap:<\/strong> S\u00fcre\u00e7, projenizin b\u00fcy\u00fckl\u00fc\u011f\u00fcne, mevcut formlar\u0131n\u0131z\u0131n karma\u015f\u0131kl\u0131\u011f\u0131na ve geli\u015ftirme ekibinizin Signals bilgisine ba\u011fl\u0131d\u0131r. K\u00fc\u00e7\u00fck ve basit formlar dakikalar i\u00e7inde d\u00f6n\u00fc\u015ft\u00fcr\u00fclebilirken, y\u00fczlerce formu olan b\u00fcy\u00fck bir kurumsal uygulama i\u00e7in bu s\u00fcre\u00e7 haftalar veya aylar s\u00fcrebilir. Kademeli bir ge\u00e7i\u015f stratejisi izlemek, riski minimize eder ve s\u00fcreci daha y\u00f6netilebilir k\u0131lar. \u00d6nce en basit formlar\u0131 d\u00f6n\u00fc\u015ft\u00fcrmek, ekibin Signals'a al\u0131\u015fmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h4>5. Signal Forms ile \u00f6zel validat\u00f6rlerimi nas\u0131l kullan\u0131r\u0131m?<\/h4>\n<p><strong>Cevap:<\/strong> \u00d6zel validat\u00f6rleriniz, Signal Forms ile de ayn\u0131 \u015fekilde \u00e7al\u0131\u015f\u0131r. Validat\u00f6r fonksiyonunuz, <code>FormControl<\/code> veya <code>FormGroup<\/code>'un g\u00fcncel de\u011ferini al\u0131p bir <code>ValidationErrors<\/code> objesi veya <code>null<\/code> d\u00f6nd\u00fcrd\u00fc\u011f\u00fc s\u00fcrece uyumlu olacakt\u0131r. Asenkron validat\u00f6rler i\u00e7in Promise veya Observable d\u00f6nd\u00fcrmeye devam edebilirsiniz. Signal Forms API'si, bu validat\u00f6rlerin sonu\u00e7lar\u0131n\u0131 i\u00e7 durumuna entegre eder ve <code>.valid()<\/code> veya <code>.errors()<\/code> gibi Signal'lar arac\u0131l\u0131\u011f\u0131yla eri\u015filebilir hale getirir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern web geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, verimlilik ve kullan\u0131c\u0131 deneyimi her zamankinden daha kritik. Angular v21, bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak&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-34925","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 v21 - Pratik Migrasyon ve Signal Forms Rehberi<\/title>\n<meta name=\"description\" content=\"Modern web geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, verimlilik ve kullan\u0131c\u0131 deneyimi her zamankinden daha kritik. Angular v21, bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak \u00fczere devrim niteli\u011finde yenilikler sunarken, \u00f6zellikle Signal Forms ile form y\u00f6netimini bamba\u015fka bir boyuta ta\u015f\u0131yor. Bu kapsaml\u0131 rehber, mevcut Angular projelerinizi v21&#039;e sorunsuz bir \u015fekilde nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ve yeni Signal Forms API&#039;sini usta bir \u015fekilde nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor, geli\u015ftirme s\u00fcrecinizi optimize etmeniz i\u00e7in pratik bilgiler sunuyor.\" \/>\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\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular v21 - Pratik Migrasyon ve Signal Forms Rehberi\" \/>\n<meta property=\"og:description\" content=\"Modern web geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, verimlilik ve kullan\u0131c\u0131 deneyimi her zamankinden daha kritik. Angular v21, bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak \u00fczere devrim niteli\u011finde yenilikler sunarken, \u00f6zellikle Signal Forms ile form y\u00f6netimini bamba\u015fka bir boyuta ta\u015f\u0131yor. Bu kapsaml\u0131 rehber, mevcut Angular projelerinizi v21&#039;e sorunsuz bir \u015fekilde nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ve yeni Signal Forms API&#039;sini usta bir \u015fekilde nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor, geli\u015ftirme s\u00fcrecinizi optimize etmeniz i\u00e7in pratik bilgiler sunuyor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-23T15:31:12+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\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Angular v21 &#8211; Pratik Migrasyon ve Signal Forms Rehberi\",\"datePublished\":\"2025-11-23T15:31:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/\"},\"wordCount\":4514,\"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\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/\",\"name\":\"Angular v21 - Pratik Migrasyon ve Signal Forms Rehberi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-23T15:31:12+00:00\",\"description\":\"Modern web geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, verimlilik ve kullan\u0131c\u0131 deneyimi her zamankinden daha kritik. Angular v21, bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak \u00fczere devrim niteli\u011finde yenilikler sunarken, \u00f6zellikle Signal Forms ile form y\u00f6netimini bamba\u015fka bir boyuta ta\u015f\u0131yor. Bu kapsaml\u0131 rehber, mevcut Angular projelerinizi v21'e sorunsuz bir \u015fekilde nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ve yeni Signal Forms API'sini usta bir \u015fekilde nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor, geli\u015ftirme s\u00fcrecinizi optimize etmeniz i\u00e7in pratik bilgiler sunuyor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular v21 &#8211; Pratik Migrasyon ve Signal Forms Rehberi\"}]},{\"@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 v21 - Pratik Migrasyon ve Signal Forms Rehberi","description":"Modern web geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, verimlilik ve kullan\u0131c\u0131 deneyimi her zamankinden daha kritik. Angular v21, bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak \u00fczere devrim niteli\u011finde yenilikler sunarken, \u00f6zellikle Signal Forms ile form y\u00f6netimini bamba\u015fka bir boyuta ta\u015f\u0131yor. Bu kapsaml\u0131 rehber, mevcut Angular projelerinizi v21'e sorunsuz bir \u015fekilde nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ve yeni Signal Forms API'sini usta bir \u015fekilde nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor, geli\u015ftirme s\u00fcrecinizi optimize etmeniz i\u00e7in pratik bilgiler sunuyor.","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\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Angular v21 - Pratik Migrasyon ve Signal Forms Rehberi","og_description":"Modern web geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, verimlilik ve kullan\u0131c\u0131 deneyimi her zamankinden daha kritik. Angular v21, bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak \u00fczere devrim niteli\u011finde yenilikler sunarken, \u00f6zellikle Signal Forms ile form y\u00f6netimini bamba\u015fka bir boyuta ta\u015f\u0131yor. Bu kapsaml\u0131 rehber, mevcut Angular projelerinizi v21'e sorunsuz bir \u015fekilde nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ve yeni Signal Forms API'sini usta bir \u015fekilde nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor, geli\u015ftirme s\u00fcrecinizi optimize etmeniz i\u00e7in pratik bilgiler sunuyor.","og_url":"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-23T15:31:12+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\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Angular v21 &#8211; Pratik Migrasyon ve Signal Forms Rehberi","datePublished":"2025-11-23T15:31:12+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/"},"wordCount":4514,"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\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/","name":"Angular v21 - Pratik Migrasyon ve Signal Forms Rehberi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-23T15:31:12+00:00","description":"Modern web geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, verimlilik ve kullan\u0131c\u0131 deneyimi her zamankinden daha kritik. Angular v21, bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak \u00fczere devrim niteli\u011finde yenilikler sunarken, \u00f6zellikle Signal Forms ile form y\u00f6netimini bamba\u015fka bir boyuta ta\u015f\u0131yor. Bu kapsaml\u0131 rehber, mevcut Angular projelerinizi v21'e sorunsuz bir \u015fekilde nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ve yeni Signal Forms API'sini usta bir \u015fekilde nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor, geli\u015ftirme s\u00fcrecinizi optimize etmeniz i\u00e7in pratik bilgiler sunuyor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/angular-v21-pratik-migrasyon-ve-signal-forms-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular v21 &#8211; Pratik Migrasyon ve Signal Forms Rehberi"}]},{"@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\/34925","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=34925"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34925\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34925"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34925"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34925"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}