{"id":35556,"date":"2025-12-01T03:40:42","date_gmt":"2025-12-01T00:40:42","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35556"},"modified":"2025-12-01T03:40:42","modified_gmt":"2025-12-01T00:40:42","slug":"angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/","title":{"rendered":"Angular&#8217;da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz"},"content":{"rendered":"<p><body><\/p>\n<h2>Angular&#8217;da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz<\/h2>\n<h3>Giri\u015f: Angular&#8217;da De\u011fi\u015fiklik Alg\u0131lama Nedir?<\/h3>\n<p>Angular, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ve pop\u00fcler bir \u00e7er\u00e7evedir. Bu \u00e7er\u00e7evenin temelinde yatan en \u00f6nemli mekanizmalardan biri, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) uygulaman\u0131n veri modeliyle senkronize tutan &#8220;De\u011fi\u015fiklik Alg\u0131lama&#8221; (Change Detection) sistemidir. Bir Angular uygulamas\u0131nda, verilerde yap\u0131lan herhangi bir de\u011fi\u015fiklik (\u00f6rne\u011fin, bir API \u00e7a\u011fr\u0131s\u0131ndan gelen yeni veriler, bir kullan\u0131c\u0131n\u0131n form alan\u0131na giri\u015f yapmas\u0131 veya bir zamanlay\u0131c\u0131n\u0131n tetiklenmesi) UI&#8217;\u0131n g\u00fcncellenmesini gerektirir. De\u011fi\u015fiklik Alg\u0131lama, bu g\u00fcncellemelerin ne zaman ve nas\u0131l yap\u0131laca\u011f\u0131n\u0131 belirleyen bir s\u00fcre\u00e7tir.<\/p>\n<p>Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama mekanizmas\u0131, uygulaman\u0131z\u0131n performans\u0131n\u0131 do\u011frudan etkileyen kritik bir bile\u015fendir. Yanl\u0131\u015f yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131nda veya anla\u015f\u0131lmad\u0131\u011f\u0131nda, gereksiz UI g\u00fcncellemelerine yol a\u00e7arak uygulaman\u0131z\u0131n yava\u015flamas\u0131na neden olabilir. Ancak do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, uygulaman\u0131z\u0131n h\u0131zl\u0131, duyarl\u0131 ve verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Bu makalede, Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama sisteminin derinliklerine inecek, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, farkl\u0131 stratejilerini ve bu stratejileri uygulaman\u0131zda nas\u0131l etkin bir \u015fekilde kullanabilece\u011finizi detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Angular&#8217;\u0131n De\u011fi\u015fiklik Alg\u0131lama Mekanizmas\u0131 Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama sistemi, temelde iki ana bile\u015fen \u00fczerine kuruludur: Zone.js ve bile\u015fen a\u011fac\u0131. Bu iki bile\u015fen, uygulaman\u0131zdaki veri de\u011fi\u015fikliklerini tespit etmek ve UI&#8217;\u0131 buna g\u00f6re g\u00fcncellemek i\u00e7in birlikte \u00e7al\u0131\u015f\u0131r.<\/p>\n<h4>Zone.js ve Asenkron \u0130\u015flemler<\/h4>\n<p>Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama sisteminin kalbinde Zone.js adl\u0131 bir k\u00fct\u00fcphane bulunur. Zone.js, taray\u0131c\u0131n\u0131n asenkron API&#8217;lerini (\u00f6rne\u011fin, <code>setTimeout<\/code>, <code>setInterval<\/code>, <code>XMLHttpRequest<\/code>, event listener&#8217;lar, Promise&#8217;ler) &#8220;yamalar&#8221; (patches). Bu yama i\u015flemi sayesinde, bir asenkron i\u015flemin ne zaman ba\u015flad\u0131\u011f\u0131n\u0131 ve ne zaman bitti\u011fini takip edebilir.<\/p>\n<p>Bir asenkron i\u015flem tamamland\u0131\u011f\u0131nda (\u00f6rne\u011fin, bir HTTP iste\u011fi ba\u015far\u0131yla sonu\u00e7land\u0131\u011f\u0131nda veya bir butona t\u0131kland\u0131\u011f\u0131nda), Zone.js Angular&#8217;\u0131 bilgilendirir. Angular, bu bildirimi bir &#8220;olas\u0131 de\u011fi\u015fiklik&#8221; sinyali olarak alg\u0131lar ve uygulaman\u0131n de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcn\u00fc tetikler. Bu sayede, geli\u015ftiricilerin her veri de\u011fi\u015fikli\u011finde manuel olarak UI g\u00fcncellemesi yapmas\u0131na gerek kalmaz; Angular bunu otomatik olarak halleder.<\/p>\n<p>Bazen, Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcn\u00fc tetiklememesini istedi\u011fimiz durumlar olabilir. \u00d6zellikle y\u00fcksek frekansl\u0131 veya UI ile do\u011frudan ilgili olmayan asenkron i\u015flemler i\u00e7in bu durum ge\u00e7erlidir. Bu senaryolarda, <code>NgZone<\/code> servisini kullanarak belirli kod bloklar\u0131n\u0131 Angular&#8217;\u0131n Zone&#8217;u d\u0131\u015f\u0131nda \u00e7al\u0131\u015ft\u0131rabiliriz. <code>NgZone.runOutsideAngular()<\/code> metodu, bu t\u00fcr i\u015flemleri Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama mekanizmas\u0131n\u0131 tetiklemeden ger\u00e7ekle\u015ftirmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4>De\u011fi\u015fiklik Alg\u0131lama A\u011fac\u0131 (Change Detection Tree)<\/h4>\n<p>Bir Angular uygulamas\u0131, bile\u015fenlerden olu\u015fan bir a\u011fa\u00e7 yap\u0131s\u0131na sahiptir. En \u00fcstte genellikle <code>AppComponent<\/code> bulunur ve di\u011fer t\u00fcm bile\u015fenler bu ana bile\u015fenin alt\u0131ndaki dallar olarak konumlan\u0131r. Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama s\u00fcreci, bu bile\u015fen a\u011fac\u0131 \u00fczerinde yukar\u0131dan a\u015fa\u011f\u0131ya do\u011fru ilerler.<\/p>\n<p>Bir de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fc tetiklendi\u011finde, Angular a\u011fac\u0131n en \u00fcst\u00fcndeki bile\u015fenden ba\u015flayarak her bir bile\u015fenin \u015fablonunda kullan\u0131lan verilerin de\u011fi\u015fip de\u011fi\u015fmedi\u011fini kontrol eder. Bu kontrol i\u015flemi, bile\u015fenlerin <code>@Input()<\/code> \u00f6zellikleri, \u015fablon ifadeleri ve bile\u015fenin i\u00e7indeki herhangi bir veri ba\u011flama i\u00e7in yap\u0131l\u0131r. E\u011fer bir bile\u015fenin verileri de\u011fi\u015fmi\u015fse, Angular o bile\u015fenin \u015fablonunu yeniden render eder ve ard\u0131ndan alt bile\u015fenlerine ge\u00e7er. Bu tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131, de\u011fi\u015fikliklerin \u00f6ng\u00f6r\u00fclebilir bir \u015fekilde yay\u0131lmas\u0131n\u0131 sa\u011flar ve d\u00f6ng\u00fcsel ba\u011f\u0131ml\u0131l\u0131klar\u0131 \u00f6nler.<\/p>\n<h4>De\u011fi\u015fiklik Alg\u0131lama D\u00f6ng\u00fcs\u00fc<\/h4>\n<p>Bir de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fc, a\u015fa\u011f\u0131daki olaylardan herhangi biri taraf\u0131ndan tetiklenebilir:<br \/>\n*   <strong>Asenkron Taray\u0131c\u0131 Olaylar\u0131:<\/strong> <code>setTimeout()<\/code>, <code>setInterval()<\/code>, <code>Promise.then()<\/code>, <code>XMLHttpRequest<\/code> (HTTP istekleri), DOM olaylar\u0131 (click, keyup vb.).<br \/>\n*   <strong>Veri De\u011fi\u015fiklikleri:<\/strong> <code>@Input()<\/code> \u00f6zellikleri arac\u0131l\u0131\u011f\u0131yla bir \u00fcst bile\u015fenden alt bile\u015fene gelen verilerin de\u011fi\u015fmesi.<br \/>\n*   <strong>Manuel Tetiklemeler:<\/strong> <code>ChangeDetectorRef<\/code> servisi arac\u0131l\u0131\u011f\u0131yla yap\u0131lan manuel tetiklemeler (ileride detayland\u0131r\u0131lacakt\u0131r).<\/p>\n<p>Bir d\u00f6ng\u00fc tetiklendi\u011finde, Angular t\u00fcm bile\u015fen a\u011fac\u0131n\u0131 yukar\u0131dan a\u015fa\u011f\u0131ya do\u011fru kontrol eder. Bu kontrol s\u0131ras\u0131nda, Angular her bile\u015fenin mevcut durumunu bir \u00f6nceki durumuyla kar\u015f\u0131la\u015ft\u0131r\u0131r. E\u011fer bir fark bulunursa, bile\u015fenin g\u00f6r\u00fcn\u00fcm\u00fc g\u00fcncellenir. Bu i\u015flem, uygulaman\u0131n veri modelinin UI ile her zaman senkronize kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>De\u011fi\u015fiklik Alg\u0131lama Stratejileri: Default vs. OnPush<\/h3>\n<p>Angular, bile\u015fenlerinizin de\u011fi\u015fiklikleri nas\u0131l alg\u0131layaca\u011f\u0131n\u0131 kontrol etmek i\u00e7in iki ana strateji sunar: <code>Default<\/code> ve <code>OnPush<\/code>. Bu stratejiler, bile\u015fen baz\u0131nda belirlenebilir ve uygulaman\u0131z\u0131n performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde etkileyebilir.<\/p>\n<h4>Default Strateji (ChangeDetectionStrategy.Default)<\/h4>\n<p>Bu, Angular bile\u015fenleri i\u00e7in varsay\u0131lan de\u011fi\u015fiklik alg\u0131lama stratejisidir. Bir bile\u015fen i\u00e7in a\u00e7\u0131k\u00e7a bir strateji belirtmedi\u011finizde, Angular otomatik olarak <code>Default<\/code> stratejisini kullan\u0131r.<\/p>\n<p>*   <strong>Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/strong> <code>Default<\/code> stratejisi, uygulaman\u0131n Zone&#8217;u i\u00e7inde herhangi bir asenkron olay (HTTP iste\u011fi, DOM olay\u0131, zamanlay\u0131c\u0131 vb.) meydana geldi\u011finde veya bir <code>@Input()<\/code> de\u011feri de\u011fi\u015fti\u011finde, Angular&#8217;\u0131n t\u00fcm bile\u015fen a\u011fac\u0131n\u0131 yukar\u0131dan a\u015fa\u011f\u0131ya do\u011fru kontrol etmesini sa\u011flar. Bu, her de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcnde, k\u00f6k bile\u015fenden ba\u015flayarak t\u00fcm alt bile\u015fenlerin (stratejileri ne olursa olsun) verilerinin de\u011fi\u015fip de\u011fi\u015fmedi\u011fini kontrol edildi\u011fi anlam\u0131na gelir.<\/p>\n<p>*   <strong>Avantajlar\u0131:<\/strong><br \/>\n    *   <strong>Basitlik:<\/strong> Geli\u015ftiricinin de\u011fi\u015fiklik alg\u0131lama hakk\u0131nda fazla d\u00fc\u015f\u00fcnmesine gerek kalmaz. Herhangi bir veri de\u011fi\u015fikli\u011fi oldu\u011funda UI&#8217;\u0131n g\u00fcncellenece\u011fi garanti edilir.<br \/>\n    *   <strong>G\u00fcvenilirlik:<\/strong> Mutasyona u\u011fram\u0131\u015f (de\u011fi\u015ftirilebilir) verilerle \u00e7al\u0131\u015f\u0131rken bile her zaman do\u011fru sonu\u00e7 verir.<\/p>\n<p>*   <strong>Dezavantajlar\u0131:<\/strong><br \/>\n    *   <strong>Performans Y\u00fck\u00fc:<\/strong> \u00d6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda, her d\u00f6ng\u00fcde t\u00fcm bile\u015fen a\u011fac\u0131n\u0131 kontrol etmek gereksiz yere zaman alabilir. Bu, uygulaman\u0131n yava\u015flamas\u0131na ve kullan\u0131c\u0131 deneyiminin d\u00fc\u015fmesine neden olabilir. Bir bile\u015fenin verileri de\u011fi\u015fmese bile, Angular onu kontrol edecektir.<\/p>\n<p>*   <strong>Ne Zaman Kullan\u0131l\u0131r?<\/strong> K\u00fc\u00e7\u00fck uygulamalar veya h\u0131zl\u0131 prototipler i\u00e7in yeterli olabilir. Ancak performans kritik uygulamalarda genellikle <code>OnPush<\/code> stratejisi tercih edilir.<\/p>\n<h4>OnPush Stratejisi (ChangeDetectionStrategy.OnPush)<\/h4>\n<p><code>OnPush<\/code> stratejisi, Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama mekanizmas\u0131 \u00fczerinde daha fazla kontrol sa\u011flayarak performans\u0131 art\u0131rmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu strateji, bile\u015fenin ve alt bile\u015fenlerinin yaln\u0131zca belirli ko\u015fullar alt\u0131nda kontrol edilmesini sa\u011flar.<\/p>\n<p>Bir bile\u015fen <code>OnPush<\/code> stratejisi ile yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131nda, Angular o bile\u015feni (ve dolay\u0131s\u0131yla alt bile\u015fenlerini) yaln\u0131zca a\u015fa\u011f\u0131daki durumlarda kontrol eder:<\/p>\n<p>1.  <strong>Giri\u015f Referanslar\u0131 De\u011fi\u015fti\u011finde:<\/strong> Bile\u015fenin <code>@Input()<\/code> \u00f6zellikleri arac\u0131l\u0131\u011f\u0131yla gelen verilerin referans\u0131 de\u011fi\u015fti\u011finde. Bu, \u00f6zellikle immutable (de\u011fi\u015fmez) veri yap\u0131lar\u0131 kullan\u0131ld\u0131\u011f\u0131nda \u00e7ok etkilidir. E\u011fer bir nesnenin veya dizinin i\u00e7eri\u011fi de\u011fi\u015fir ancak referans\u0131 ayn\u0131 kal\u0131rsa, <code>OnPush<\/code> bile\u015feni otomatik olarak kontrol etmez.<br \/>\n2.  <strong>Bile\u015fenin Kendisinden veya Alt Bile\u015fenlerinden Bir Olay Tetiklendi\u011finde:<\/strong> Bile\u015fenin kendi \u015fablonunda veya alt bile\u015fenlerinin \u015fablonunda bir DOM olay\u0131 (\u00f6rne\u011fin, bir buton t\u0131klamas\u0131, form giri\u015fi) meydana geldi\u011finde.<br \/>\n3.  <strong><code>async<\/code> Pipe Kullan\u0131ld\u0131\u011f\u0131nda:<\/strong> Bile\u015fenin \u015fablonunda bir <code>Observable<\/code> veya <code>Promise<\/code> ile <code>async<\/code> pipe kullan\u0131ld\u0131\u011f\u0131nda ve bu <code>Observable<\/code> yeni bir de\u011fer yayd\u0131\u011f\u0131nda. <code>async<\/code> pipe, Angular&#8217;a otomatik olarak bile\u015feni kontrol etmesi gerekti\u011fini bildirir.<br \/>\n4.  <strong>Manuel Olarak Tetiklendi\u011finde:<\/strong> <code>ChangeDetectorRef<\/code> servisi kullan\u0131larak <code>markForCheck()<\/code> veya <code>detectChanges()<\/code> metotlar\u0131 \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda.<\/p>\n<p>*   <strong>Avantajlar\u0131:<\/strong><br \/>\n    *   <strong>\u00d6nemli Performans Kazanc\u0131:<\/strong> Gereksiz de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fclerini ve kontrollerini ortadan kald\u0131r\u0131r. Yaln\u0131zca ger\u00e7ekten de\u011fi\u015fmesi gereken bile\u015fenler kontrol edilir.<br \/>\n    *   <strong>Daha \u00d6ng\u00f6r\u00fclebilir Davran\u0131\u015f:<\/strong> Bile\u015fenlerin ne zaman g\u00fcncellenece\u011fi daha net hale gelir.<br \/>\n    *   <strong>Immutable Veri Kullan\u0131m\u0131n\u0131 Te\u015fvik Eder:<\/strong> Performans avantajlar\u0131ndan tam olarak yararlanmak i\u00e7in immutable veri yap\u0131lar\u0131 kullanmaya te\u015fvik eder, bu da uygulaman\u0131n daha kararl\u0131 ve hatas\u0131z olmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<p>*   <strong>Dezavantajlar\u0131:<\/strong><br \/>\n    *   <strong>Daha Fazla Dikkat Gerektirir:<\/strong> Mutasyona u\u011fram\u0131\u015f verilerle \u00e7al\u0131\u015f\u0131rken dikkatli olunmal\u0131d\u0131r. E\u011fer bir nesnenin i\u00e7ini de\u011fi\u015ftirir ama referans\u0131n\u0131 de\u011fi\u015ftirmezseniz, <code>OnPush<\/code> bile\u015feniniz g\u00fcncellenmeyebilir.<br \/>\n    *   <strong>\u00d6\u011frenme E\u011frisi:<\/strong> \u00d6zellikle yeni ba\u015flayanlar i\u00e7in <code>OnPush<\/code> stratejisi ve <code>ChangeDetectorRef<\/code> kullan\u0131m\u0131 ba\u015flang\u0131\u00e7ta biraz karma\u015f\u0131k gelebilir.<\/p>\n<p>*   <strong>Ne Zaman Kullan\u0131l\u0131r?<\/strong> B\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda, performans\u0131n kritik oldu\u011fu durumlarda ve m\u00fcmk\u00fcnse her bile\u015fende <code>OnPush<\/code> stratejisinin kullan\u0131lmas\u0131 \u015fiddetle tavsiye edilir. Genellikle, bile\u015fenlerin \u00e7o\u011fu stateless (durumsuz) veya dumb (aptal) bile\u015fenler oldu\u011fundan, <code>OnPush<\/code> onlar i\u00e7in m\u00fckemmel bir se\u00e7imdir.<\/p>\n<h3>OnPush Stratejisi ile \u00c7al\u0131\u015fmak: Detaylar ve En \u0130yi Uygulamalar<\/h3>\n<p><code>OnPush<\/code> stratejisi, Angular uygulamalar\u0131n\u0131z\u0131n performans\u0131n\u0131 optimize etmek i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Ancak, do\u011fru bir \u015fekilde kullan\u0131lmad\u0131\u011f\u0131nda beklenmedik davran\u0131\u015flara yol a\u00e7abilir. \u0130\u015fte <code>OnPush<\/code> ile \u00e7al\u0131\u015f\u0131rken dikkat etmeniz gereken detaylar ve en iyi uygulamalar:<\/p>\n<h4>Immutable Veri Yap\u0131lar\u0131<\/h4>\n<p><code>OnPush<\/code> stratejisinin en temel gereksinimlerinden biri, <code>@Input()<\/code> \u00f6zellikleri arac\u0131l\u0131\u011f\u0131yla bile\u015fenlere iletilen verilerin immutable (de\u011fi\u015fmez) olmas\u0131d\u0131r. Angular, <code>OnPush<\/code> bile\u015fenini yaln\u0131zca <code>@Input()<\/code> referans\u0131 de\u011fi\u015fti\u011finde kontrol eder.<\/p>\n<p>*   <strong>Mutable (De\u011fi\u015febilir) Veri \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-typescript\">\/\/ Parent Component\n    data = { value: 'initial' };\n    changeData() {\n      this.data.value = 'updated'; \/\/ Referans de\u011fi\u015fmiyor, sadece i\u00e7erik\n    }\n\n    \/\/ Child Component (OnPush)\n    @Input() data: { value: string };<\/code><\/pre>\n<p>    Yukar\u0131daki senaryoda, <code>changeData()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda <code>data<\/code> nesnesinin referans\u0131 de\u011fi\u015fmedi\u011fi i\u00e7in <code>ChildComponent<\/code> otomatik olarak g\u00fcncellenmeyecektir.<\/p>\n<p>*   <strong>Immutable (De\u011fi\u015fmez) Veri \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-typescript\">\/\/ Parent Component\n    data = { value: 'initial' };\n    changeDataImmutable() {\n      this.data = { ...this.data, value: 'updated' }; \/\/ Yeni bir referans olu\u015fturuluyor\n    }\n    \/\/ Veya bir dizi i\u00e7in:\n    items = [1, 2, 3];\n    addItemImmutable() {\n      this.items = [...this.items, 4]; \/\/ Yeni bir dizi referans\u0131 olu\u015fturuluyor\n    }\n\n    \/\/ Child Component (OnPush)\n    @Input() data: { value: string };\n    @Input() items: number[];<\/code><\/pre>\n<p>    Bu \u00f6rneklerde, <code>data<\/code> veya <code>items<\/code> nesnelerinin yeni bir referans\u0131 olu\u015fturuldu\u011fu i\u00e7in <code>ChildComponent<\/code> do\u011fru bir \u015fekilde g\u00fcncellenecektir. Immutable.js veya Immer gibi k\u00fct\u00fcphaneler, daha karma\u015f\u0131k immutable veri y\u00f6netimi i\u00e7in kullan\u0131labilir.<\/p>\n<h4>Async Pipe (<code>async<\/code> pipe)<\/h4>\n<p><code>async<\/code> pipe, <code>OnPush<\/code> stratejisi ile birlikte kullan\u0131ld\u0131\u011f\u0131nda m\u00fckemmel bir uyum sa\u011flar. Bir <code>Observable<\/code> veya <code>Promise<\/code> ile kullan\u0131ld\u0131\u011f\u0131nda, <code>async<\/code> pipe otomatik olarak \u015funlar\u0131 yapar:<br \/>\n*   <code>Observable<\/code> yeni bir de\u011fer yayd\u0131\u011f\u0131nda, Angular&#8217;a bu bile\u015feni <code>markForCheck()<\/code> ile i\u015faretlemesini ve bir sonraki de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcnde kontrol etmesini bildirir.<br \/>\n*   Bile\u015fen yok edildi\u011finde (destroyed), <code>Observable<\/code> aboneli\u011fini otomatik olarak kald\u0131r\u0131r, b\u00f6ylece bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nler.<\/p>\n<p>Bu, <code>OnPush<\/code> bile\u015fenlerinde <code>Observable<\/code>&#8216;lar\u0131 y\u00f6netmenin en temiz ve performansl\u0131 yoludur.<\/p>\n<pre><code class=\"language-typescript\">import { Component, ChangeDetectionStrategy } from '@angular\/core';\nimport { Observable, interval } from 'rxjs';\nimport { map } from 'rxjs\/operators';\n\n@Component({\n  selector: 'app-async-data',\n  template: <code>\n    <h3>Async Pipe ile Veri:<\/h3>\n    <p>Say\u0131: {{ counter$ | async }}<\/p>\n  <\/code>,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AsyncDataComponent {\n  counter$: Observable<number>;\n\n  constructor() {\n    this.counter$ = interval(1000).pipe(map(val => val + 1));\n  }\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>interval<\/code> Observable her saniye yeni bir de\u011fer yayd\u0131\u011f\u0131nda, <code>async<\/code> pipe <code>AsyncDataComponent<\/code>&#8216;i otomatik olarak kontrol ettirir ve UI g\u00fcncellenir.<\/p>\n<h4>ChangeDetectorRef S\u0131n\u0131f\u0131<\/h4>\n<p><code>ChangeDetectorRef<\/code> s\u0131n\u0131f\u0131, <code>OnPush<\/code> stratejisi ile \u00e7al\u0131\u015f\u0131rken de\u011fi\u015fiklik alg\u0131lama s\u00fcrecini manuel olarak kontrol etmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/p>\n<p>*   <strong><code>markForCheck()<\/code>:<\/strong> Bu metod, bile\u015fenin (veya \u00fcst bile\u015fenlerinin) durumunun de\u011fi\u015fmi\u015f olabilece\u011fini Angular&#8217;a bildirir ve bir sonraki de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcnde bile\u015fenin kontrol edilmesini sa\u011flar. <code>markForCheck()<\/code> metodu, bile\u015fenin <code>@Input()<\/code> referans\u0131 de\u011fi\u015fmedi\u011finde ancak i\u00e7 durumu (\u00f6rne\u011fin, bir servisten gelen verilerle g\u00fcncellenen \u00f6zel bir \u00f6zellik) de\u011fi\u015fti\u011finde kullan\u0131\u015fl\u0131d\u0131r. Bu metod sadece bile\u015feni kontrol i\u00e7in i\u015faretler, hemen bir de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fc tetiklemez.<\/p>\n<pre><code class=\"language-typescript\">import { Component, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular\/core';\n\n    @Component({\n      selector: 'app-manual-check',\n      template: <code>\n        <h3>Manual Check ile Veri:<\/h3>\n        <p>Mesaj: {{ message }}<\/p>\n        <button (click)=\"updateMessage()\">Mesaj\u0131 G\u00fcncelle<\/button>\n      <\/code>,\n      changeDetection: ChangeDetectionStrategy.OnPush,\n    })\n    export class ManualCheckComponent {\n      message: string = '\u0130lk Mesaj';\n\n      constructor(private cdr: ChangeDetectorRef) {}\n\n      updateMessage() {\n        this.message = 'G\u00fcncellenmi\u015f Mesaj ' + new Date().toLocaleTimeString();\n        \/\/ Input referans\u0131 de\u011fi\u015fmedi\u011fi i\u00e7in manuel olarak i\u015faretlememiz gerekiyor\n        this.cdr.markForCheck();\n      }\n    }<\/code><\/pre>\n<p>*   <strong><code>detectChanges()<\/code>:<\/strong> Bu metod, ge\u00e7erli bile\u015fenin ve t\u00fcm alt bile\u015fenlerinin de\u011fi\u015fikliklerini hemen alg\u0131lamaya zorlar. Bu, <code>markForCheck()<\/code>&#8216;ten farkl\u0131 olarak, hemen bir de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fc ba\u015flat\u0131r ve sadece bu bile\u015fen dal\u0131n\u0131 kontrol eder. <code>detectChanges()<\/code> genellikle dikkatli kullan\u0131lmal\u0131d\u0131r, \u00e7\u00fcnk\u00fc s\u0131k veya yanl\u0131\u015f kullan\u0131m\u0131 performans\u0131 olumsuz etkileyebilir. \u00d6zellikle \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerle veya Angular&#8217;\u0131n Zone&#8217;u d\u0131\u015f\u0131nda \u00e7al\u0131\u015fan kodlarla entegrasyon yaparken faydal\u0131 olabilir.<\/p>\n<p>*   <strong><code>detach()<\/code> ve <code>reattach()<\/code>:<\/strong> Bu metodlar, bir bile\u015feni de\u011fi\u015fiklik alg\u0131lama a\u011fac\u0131ndan tamamen ay\u0131rman\u0131za ve gerekti\u011finde yeniden ba\u011flaman\u0131za olanak tan\u0131r. \u00c7ok y\u00fcksek frekansl\u0131 g\u00fcncellemelerin oldu\u011fu (\u00f6rne\u011fin, bir oyun d\u00f6ng\u00fcs\u00fc veya bir video ak\u0131\u015f\u0131) ve UI&#8217;\u0131n yaln\u0131zca belirli aral\u0131klarla g\u00fcncellenmesini istedi\u011finiz nadir durumlar i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. <code>detach()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, bile\u015fen ve alt bile\u015fenleri art\u0131k otomatik olarak kontrol edilmez. <code>reattach()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda ise tekrar de\u011fi\u015fiklik alg\u0131lama a\u011fac\u0131na dahil edilirler.<\/p>\n<p>*   <strong><code>checkNoChanges()<\/code>:<\/strong> Bu metod, yaln\u0131zca geli\u015ftirme modunda kullan\u0131lmak \u00fczere tasarlanm\u0131\u015ft\u0131r. Mevcut de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcn\u00fcn sonunda, bile\u015fende herhangi bir de\u011fi\u015fiklik olmad\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in kullan\u0131l\u0131r. E\u011fer bu metod \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda bir de\u011fi\u015fiklik tespit edilirse, Angular bir hata f\u0131rlat\u0131r. Bu, &#8220;tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131&#8221; kural\u0131n\u0131n ihlal edildi\u011fi durumlar\u0131 (yani, bir bile\u015fenin \u015fablonunda bir de\u011feri de\u011fi\u015ftirmesi ve bu de\u011fi\u015fikli\u011fin ayn\u0131 d\u00f6ng\u00fcde ba\u015fka bir bile\u015feni etkilemesi) tespit etmek i\u00e7in yararl\u0131d\u0131r.<\/p>\n<h4>Eventler ve OnPush<\/h4>\n<p><code>OnPush<\/code> stratejisine sahip bir bile\u015fende, bile\u015fenin kendi \u015fablonunda veya alt bile\u015fenlerinin \u015fablonunda bir DOM olay\u0131 (click, keyup vb.) tetiklendi\u011finde, Angular otomatik olarak o bile\u015feni (ve dolay\u0131s\u0131yla alt bile\u015fenlerini) kontrol eder. Bu, kullan\u0131c\u0131 etkile\u015fimlerinin her zaman UI&#8217;\u0131 g\u00fcncellemesini sa\u011flar ve \u00e7o\u011fu durumda <code>markForCheck()<\/code> \u00e7a\u011f\u0131rmaya gerek kalmaz.<\/p>\n<pre><code class=\"language-typescript\">import { Component, ChangeDetectionStrategy } from '@angular\/core';\n\n@Component({\n  selector: 'app-event-driven',\n  template: <code>\n    <h3>Event Driven OnPush:<\/h3>\n    <p>Saya\u00e7: {{ count }}<\/p>\n    <button (click)=\"increment()\">Artt\u0131r<\/button>\n  <\/code>,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EventDrivenComponent {\n  count: number = 0;\n\n  increment() {\n    this.count++; \/\/ Bu de\u011fi\u015fiklik, click olay\u0131 sayesinde alg\u0131lan\u0131r.\n  }\n}<\/code><\/pre>\n<h4>Pipe&#8217;lar ve OnPush<\/h4>\n<p>Angular pipe&#8217;lar\u0131, verileri \u015fablonda d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kullan\u0131l\u0131r. Pipe&#8217;lar varsay\u0131lan olarak &#8220;pure&#8221; (saf) olarak kabul edilir.<br \/>\n*   <strong>Pure Pipe&#8217;lar:<\/strong> Yaln\u0131zca giri\u015f de\u011ferleri de\u011fi\u015fti\u011finde yeniden y\u00fcr\u00fct\u00fcl\u00fcr. Bu, <code>OnPush<\/code> stratejisi ile m\u00fckemmel bir \u015fekilde \u00e7al\u0131\u015f\u0131r, \u00e7\u00fcnk\u00fc pipe&#8217;\u0131n gereksiz yere \u00e7al\u0131\u015fmas\u0131n\u0131 engeller.<br \/>\n*   <strong>Impure Pipe&#8217;lar:<\/strong> Her de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcnde yeniden y\u00fcr\u00fct\u00fcl\u00fcr. <code>OnPush<\/code> bile\u015fenlerinde bile impure pipe&#8217;lar her zaman \u00e7al\u0131\u015f\u0131r, bu nedenle dikkatli kullan\u0131lmal\u0131d\u0131r. Genellikle, impure pipe&#8217;lardan ka\u00e7\u0131nmak veya yaln\u0131zca \u00e7ok \u00f6zel durumlarda kullanmak en iyisidir.<\/p>\n<h3>Pratik Senaryolar ve \u00d6rnekler<\/h3>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi peki\u015ftirmek i\u00e7in baz\u0131 pratik senaryolar ve kod \u00f6rnekleri \u00fczerinden ge\u00e7elim.<\/p>\n<h4>Basit OnPush Bile\u015feni ve MarkForCheck Kullan\u0131m\u0131<\/h4>\n<p>Bu \u00f6rnek, bir \u00fcst bile\u015fenin veri g\u00f6nderdi\u011fi ve bir alt <code>OnPush<\/code> bile\u015feninin bu veriyi g\u00f6r\u00fcnt\u00fcledi\u011fi bir senaryoyu g\u00f6sterir. Alt bile\u015fenin kendi i\u00e7 durumunu g\u00fcncelledi\u011finde <code>markForCheck()<\/code>&#8216;i nas\u0131l kullanmas\u0131 gerekti\u011fini de g\u00f6sterece\u011fiz.<\/p>\n<pre><code class=\"language-typescript\">\/\/ app.component.ts (Parent Component)\nimport { Component } from '@angular\/core';\n\ninterface User {\n  name: string;\n  age: number;\n}\n\n@Component({\n  selector: 'app-root',\n  template: <code>\n    \n    <button (click)=\"changeUserName()\">Kullan\u0131c\u0131 Ad\u0131n\u0131 De\u011fi\u015ftir (Immutable)<\/button>\n    <button (click)=\"changeUserAgeMutable()\">Kullan\u0131c\u0131 Ya\u015f\u0131n\u0131 De\u011fi\u015ftir (Mutable)<\/button>\n    <app-user-detail [user]=\"currentUser\"><\/app-user-detail>\n  <\/code>,\n})\nexport class AppComponent {\n  currentUser: User = { name: 'Alice', age: 30 };\n\n  changeUserName() {\n    \/\/ Yeni bir referans olu\u015fturarak name \u00f6zelli\u011fini g\u00fcncelliyoruz\n    this.currentUser = { ...this.currentUser, name: 'Bob ' + new Date().toLocaleTimeString() };\n  }\n\n  changeUserAgeMutable() {\n    \/\/ Referans\u0131 de\u011fi\u015ftirmeden age \u00f6zelli\u011fini g\u00fcncelliyoruz\n    this.currentUser.age++;\n    \/\/ Bu durumda UserDetailComponent (OnPush ise) otomatik g\u00fcncellenmez!\n    console.log('Ya\u015f g\u00fcncellendi (mutable):', this.currentUser.age);\n  }\n}\n\n\/\/ user-detail.component.ts (Child Component - OnPush)\nimport { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular\/core';\n\ninterface User {\n  name: string;\n  age: number;\n}\n\n@Component({\n  selector: 'app-user-detail',\n  template: <code>\n    <div style=\"border: 1px solid blue; padding: 10px; margin-top: 10px;\">\n      <h3>Kullan\u0131c\u0131 Detay\u0131 (OnPush)<\/h3>\n      <p>Ad: {{ user.name }}<\/p>\n      <p>Ya\u015f: {{ user.age }}<\/p>\n      <p>\u0130\u00e7 Saya\u00e7: {{ internalCounter }}<\/p>\n      <button (click)=\"incrementInternalCounter()\">\u0130\u00e7 Sayac\u0131 Artt\u0131r (markForCheck)<\/button>\n      <button (click)=\"forceDetectChanges()\">De\u011fi\u015fiklikleri Zorla Alg\u0131la (detectChanges)<\/button>\n    <\/div>\n  <\/code>,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UserDetailComponent {\n  @Input() user!: User;\n  internalCounter: number = 0;\n\n  constructor(private cdr: ChangeDetectorRef) {}\n\n  ngOnInit() {\n    console.log('UserDetailComponent initialized');\n  }\n\n  ngOnChanges(changes: any) {\n    console.log('UserDetailComponent ngOnChanges:', changes);\n  }\n\n  incrementInternalCounter() {\n    this.internalCounter++;\n    \/\/ \u0130\u00e7 durum de\u011fi\u015fti\u011fi i\u00e7in OnPush bile\u015feninin g\u00fcncellenmesi i\u00e7in i\u015faretliyoruz.\n    this.cdr.markForCheck();\n    console.log('\u0130\u00e7 saya\u00e7 artt\u0131r\u0131ld\u0131:', this.internalCounter);\n  }\n\n  forceDetectChanges() {\n    \/\/ Bu bile\u015feni ve alt bile\u015fenlerini hemen kontrol etmeye zorlar.\n    this.cdr.detectChanges();\n    console.log('De\u011fi\u015fiklikler manuel olarak alg\u0131land\u0131.');\n  }\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte:<br \/>\n*   <code>changeUserName()<\/code> metodunu \u00e7a\u011f\u0131rd\u0131\u011f\u0131n\u0131zda, <code>currentUser<\/code> nesnesinin referans\u0131 de\u011fi\u015fti\u011fi i\u00e7in <code>UserDetailComponent<\/code> g\u00fcncellenir.<br \/>\n<em>   <code>changeUserAgeMutable()<\/code> metodunu \u00e7a\u011f\u0131rd\u0131\u011f\u0131n\u0131zda, <code>currentUser<\/code> nesnesinin referans\u0131 de\u011fi\u015fmedi\u011fi i\u00e7in <code>UserDetailComponent<\/code> <\/em>otomatik olarak g\u00fcncellenmez*. UI&#8217;da <code>age<\/code> de\u011feri de\u011fi\u015fmez g\u00f6r\u00fcn\u00fcr. E\u011fer bu de\u011fi\u015fikli\u011fin UI&#8217;a yans\u0131mas\u0131n\u0131 isteseydik, ya <code>currentUser<\/code> nesnesini immutable yapmal\u0131yd\u0131k ya da <code>UserDetailComponent<\/code> i\u00e7inde <code>this.cdr.markForCheck()<\/code> \u00e7a\u011f\u0131rmal\u0131yd\u0131k.<br \/>\n*   <code>incrementInternalCounter()<\/code> metodunu \u00e7a\u011f\u0131rd\u0131\u011f\u0131n\u0131zda, <code>internalCounter<\/code> de\u011fi\u015fir. <code>markForCheck()<\/code> \u00e7a\u011fr\u0131lmad\u0131k\u00e7a UI g\u00fcncellenmez. <code>markForCheck()<\/code> sayesinde, bir sonraki de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcnde bu bile\u015fen kontrol edilir.<br \/>\n*   <code>forceDetectChanges()<\/code> metodu, <code>UserDetailComponent<\/code>&#8216;i hemen kontrol etmeye zorlar.<\/p>\n<h4>Formlar ve OnPush<\/h4>\n<p>Angular&#8217;\u0131n reaktif formlar\u0131 veya template-driven formlar\u0131, <code>OnPush<\/code> stratejisiyle iyi \u00e7al\u0131\u015f\u0131r. Bir form kontrol\u00fcn\u00fcn de\u011feri de\u011fi\u015fti\u011finde, ilgili DOM olay\u0131 (\u00f6rne\u011fin <code>input<\/code> olay\u0131) <code>OnPush<\/code> bile\u015fenini tetikler ve de\u011fi\u015fiklikler alg\u0131lan\u0131r. Ancak, bazen \u00f6zel form kontrolleri veya d\u0131\u015far\u0131dan gelen verilerle formun de\u011ferini manuel olarak ayarlad\u0131\u011f\u0131n\u0131zda, <code>markForCheck()<\/code> kullanman\u0131z gerekebilir.<\/p>\n<pre><code class=\"language-typescript\">import { Component, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular\/core';\nimport { FormControl } from '@angular\/forms';\n\n@Component({\n  selector: 'app-form-onpush',\n  template: <code>\n    <div style=\"border: 1px solid green; padding: 10px; margin-top: 10px;\">\n      <h3>Form ile OnPush<\/h3>\n      <input [formControl]=\"nameControl\" placeholder=\"Ad\u0131n\u0131z\" \/>\n      <p>Form De\u011feri: {{ nameControl.value }}<\/p>\n      <button (click)=\"setNameProgrammatically()\">Ad\u0131 Programatik Olarak Ayarla<\/button>\n    <\/div>\n  <\/code>,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormOnpushComponent {\n  nameControl = new FormControl('Varsay\u0131lan Ad');\n\n  constructor(private cdr: ChangeDetectorRef) {}\n\n  setNameProgrammatically() {\n    this.nameControl.setValue('Yeni Ad ' + new Date().toLocaleTimeString());\n    \/\/ setValue() bir DOM olay\u0131 tetiklemedi\u011fi i\u00e7in, OnPush bile\u015feninin g\u00fcncellenmesi i\u00e7in i\u015faretlememiz gerekebilir.\n    \/\/ Ancak FormControl'\u00fcn kendisi bir Observable'a sahip oldu\u011fu i\u00e7in genellikle bu gerekli de\u011fildir.\n    \/\/ Yine de karma\u015f\u0131k senaryolarda ak\u0131lda bulundurulmal\u0131d\u0131r.\n    this.cdr.markForCheck();\n  }\n}<\/code><\/pre>\n<h3>De\u011fi\u015fiklik Alg\u0131lama Performans\u0131n\u0131 \u0130zleme ve Optimize Etme<\/h3>\n<p>Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e, de\u011fi\u015fiklik alg\u0131lama performans\u0131n\u0131 izlemek ve optimize etmek kritik hale gelir.<\/p>\n<p>*   <strong>Angular DevTools:<\/strong> Chrome uzant\u0131s\u0131 olarak sunulan Angular DevTools, uygulaman\u0131zdaki bile\u015fen a\u011fac\u0131n\u0131 ve her bir de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcnde hangi bile\u015fenlerin kontrol edildi\u011fini g\u00f6rselle\u015ftirmek i\u00e7in harika bir ara\u00e7t\u0131r. Profiler sekmesi, de\u011fi\u015fiklik alg\u0131lama s\u00fcrelerini ve hangi bile\u015fenlerin en \u00e7ok zaman ald\u0131\u011f\u0131n\u0131 g\u00f6sterir.<br \/>\n*   <strong>Chrome DevTools (Performance Tab):<\/strong> Genel taray\u0131c\u0131 performans\u0131 i\u00e7in Chrome DevTools&#8217;un Performance sekmesini kullanabilirsiniz. Burada, Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fclerinin neden oldu\u011fu &#8220;Scripting&#8221; s\u00fcrelerini g\u00f6rebilirsiniz.<br \/>\n*   <strong>Optimizasyon Stratejileri:<\/strong><br \/>\n    *   <strong>OnPush Stratejisini Kullan\u0131n:<\/strong> M\u00fcmk\u00fcn olan her yerde <code>OnPush<\/code> stratejisini varsay\u0131lan olarak kabul edin.<br \/>\n    *   <strong>Immutable Veri Kullan\u0131n:<\/strong> <code>@Input()<\/code> ile gelen verileri de\u011fi\u015ftirirken her zaman yeni referanslar olu\u015fturun.<br \/>\n    *   <strong><code>async<\/code> Pipe&#8217;\u0131 Kullan\u0131n:<\/strong> <code>Observable<\/code>&#8216;lar ile \u00e7al\u0131\u015f\u0131rken <code>async<\/code> pipe&#8217;\u0131 tercih edin.<br \/>\n    <em>   <strong><code>trackBy<\/code> ile <code><\/em>ngFor<\/code>:<\/strong> <code>*ngFor<\/code> d\u00f6ng\u00fclerinde <code>trackBy<\/code> fonksiyonunu kullanarak, yaln\u0131zca de\u011fi\u015fen \u00f6\u011felerin yeniden render edilmesini sa\u011flay\u0131n.<br \/>\n    *   <strong><code>NgZone.runOutsideAngular()<\/code>:<\/strong> Y\u00fcksek frekansl\u0131, UI ile do\u011frudan ilgili olmayan i\u015flemler i\u00e7in bu metodu kullanarak Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcn\u00fc tetiklemekten ka\u00e7\u0131n\u0131n.<br \/>\n    *   <strong>Gereksiz Bile\u015fenleri Ay\u0131r\u0131n (<code>detach()<\/code>):<\/strong> \u00c7ok nadir durumlarda, belirli bile\u015fenleri de\u011fi\u015fiklik alg\u0131lama a\u011fac\u0131ndan ge\u00e7ici olarak ay\u0131rarak performans\u0131 art\u0131rabilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama mekanizmas\u0131, uygulaman\u0131z\u0131n reaktif ve verimli olmas\u0131n\u0131 sa\u011flayan temel bir \u00f6zelliktir. <code>Default<\/code> stratejisi ba\u015flang\u0131\u00e7 i\u00e7in basitlik sunsa da, <code>OnPush<\/code> stratejisi b\u00fcy\u00fck ve performans kritik uygulamalar i\u00e7in vazge\u00e7ilmezdir. <code>OnPush<\/code>&#8216;i benimsemek, geli\u015ftiricileri immutable veri yap\u0131lar\u0131n\u0131 kullanmaya te\u015fvik eder ve <code>async<\/code> pipe ile <code>ChangeDetectorRef<\/code> gibi ara\u00e7larla daha performansl\u0131 ve \u00f6ng\u00f6r\u00fclebilir uygulamalar yazmalar\u0131na olanak tan\u0131r.<\/p>\n<p>Bu makalede ele al\u0131nan kavramlar\u0131 ve en iyi uygulamalar\u0131 anlayarak ve uygulayarak, Angular uygulamalar\u0131n\u0131z\u0131n performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir, daha iyi bir kullan\u0131c\u0131 deneyimi sunabilir ve daha s\u00fcrd\u00fcr\u00fclebilir bir kod taban\u0131 olu\u015fturabilirsiniz. De\u011fi\u015fiklik alg\u0131lama, Angular ekosisteminin en g\u00fc\u00e7l\u00fc ve en \u00f6nemli y\u00f6nlerinden biridir ve her Angular geli\u015ftiricisinin derinlemesine anlamas\u0131 gereken bir konudur.<br \/>\n<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Angular&#8217;da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz\nGiri\u015f: Angular&#8217;da De\u011fi\u015fiklik Alg\u0131lama Nedir?\nAngular, modern w","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-35556","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&#039;da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular&#039;da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz\" \/>\n<meta property=\"og:description\" content=\"Angular&#039;da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz Giri\u015f: Angular&#039;da De\u011fi\u015fiklik Alg\u0131lama Nedir? Angular, modern w\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-01T00:40:42+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=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Angular&#8217;da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz\",\"datePublished\":\"2025-12-01T00:40:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/\"},\"wordCount\":3027,\"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-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/\",\"name\":\"Angular'da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-01T00:40:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular&#8217;da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz\"}]},{\"@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'da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/","og_locale":"tr_TR","og_type":"article","og_title":"Angular'da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz","og_description":"Angular'da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz Giri\u015f: Angular'da De\u011fi\u015fiklik Alg\u0131lama Nedir? Angular, modern w","og_url":"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-01T00:40:42+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Angular&#8217;da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz","datePublished":"2025-12-01T00:40:42+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/"},"wordCount":3027,"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-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/","url":"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/","name":"Angular'da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-01T00:40:42+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/angularda-degisiklik-algilama-stratejilerini-kullanmak-detayli-bir-kilavuz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular&#8217;da De\u011fi\u015fiklik Alg\u0131lama Stratejilerini Kullanmak: Detayl\u0131 Bir K\u0131lavuz"}]},{"@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\/35556","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=35556"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35556\/revisions"}],"predecessor-version":[{"id":35557,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35556\/revisions\/35557"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35556"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35556"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}