{"id":36168,"date":"2025-12-09T14:31:22","date_gmt":"2025-12-09T11:31:22","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/"},"modified":"2025-12-09T14:31:22","modified_gmt":"2025-12-09T11:31:22","slug":"angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/","title":{"rendered":"Angular UI Neden Da\u011f\u0131l\u0131r? Rota Y\u00f6netimi Nas\u0131l Kurtar\u0131r?"},"content":{"rendered":"<p>Angular uygulamalar\u0131nda kullan\u0131c\u0131 aray\u00fcz\u00fc (UI) karma\u015fas\u0131yla m\u0131 kar\u015f\u0131la\u015f\u0131yorsunuz? Bu makale, Angular g\u00f6r\u00fcn\u00fcmlerinin temel sorunlar\u0131n\u0131 ve g\u00fc\u00e7l\u00fc rota y\u00f6netiminin bu sorunlar\u0131 nas\u0131l \u00e7\u00f6zd\u00fc\u011f\u00fcn\u00fc ad\u0131m ad\u0131m inceliyor. Modern web uygulamalar\u0131n\u0131n beklentileri artt\u0131k\u00e7a, karma\u015f\u0131k aray\u00fczler ve dinamik i\u00e7erik y\u00f6netimi, geli\u015ftiriciler i\u00e7in \u00f6nemli zorluklar yarat\u0131yor. Tek Sayfa Uygulamalar\u0131 (SPA) mimarisi bu zorluklar\u0131 a\u015fmada \u00f6nemli avantajlar sunsa da, do\u011fru stratejiler uygulanmad\u0131\u011f\u0131nda kullan\u0131c\u0131 deneyimi h\u0131zla bozulabilir. Peki, Angular UI&#8217;\u0131n\u0131z neden beklenmedik \u015fekillerde da\u011f\u0131l\u0131yor ve bu sorunu rota y\u00f6netimi (routing) ile nas\u0131l kal\u0131c\u0131 olarak \u00e7\u00f6zebilirsiniz? Bu yaz\u0131da, bu sorular\u0131n cevaplar\u0131n\u0131 ger\u00e7ek d\u00fcnya senaryolar\u0131 ve pratik \u00f6rneklerle ele alaca\u011f\u0131z.<\/p>\n<h3>Giri\u015f: Angular Uygulamalar\u0131nda Kullan\u0131c\u0131 Deneyimi Neden Kritik Bir Noktad\u0131r?<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda kullan\u0131c\u0131 beklentileri hi\u00e7 olmad\u0131\u011f\u0131 kadar y\u00fcksek. Bir web uygulamas\u0131ndan beklenen sadece i\u015flevsellik de\u011fil, ayn\u0131 zamanda ak\u0131c\u0131, sezgisel ve hatas\u0131z bir kullan\u0131c\u0131 deneyimidir. H\u0131zl\u0131 y\u00fcklenen sayfalar, kesintisiz gezinme ve her cihazda tutarl\u0131 bir g\u00f6r\u00fcn\u00fcm, kullan\u0131c\u0131lar\u0131n bir uygulamay\u0131 benimsemesi veya terk etmesi aras\u0131ndaki fark\u0131 yaratabilir. Angular gibi g\u00fc\u00e7l\u00fc framework&#8217;ler, bu beklentileri kar\u015f\u0131lamak \u00fczere tasarlanm\u0131\u015f olsa da, UI&#8217;\u0131n karma\u015f\u0131k yap\u0131s\u0131 ve s\u00fcrekli de\u011fi\u015fen durumlar, geli\u015ftiriciler i\u00e7in potansiyel tuzaklar bar\u0131nd\u0131r\u0131r. \u00d6zellikle b\u00fcy\u00fck ve dinamik Angular uygulamalar\u0131nda, farkl\u0131 g\u00f6r\u00fcn\u00fcmler (views) ve bile\u015fenler (components) aras\u0131ndaki ge\u00e7i\u015fleri y\u00f6netmek, uygulaman\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 ve kullan\u0131c\u0131 dostu olmas\u0131n\u0131 do\u011frudan etkiler. Yanl\u0131\u015f bir y\u00f6netim stratejisi, uygulaman\u0131n performans\u0131n\u0131 d\u00fc\u015f\u00fcrebilir, bak\u0131m\u0131n\u0131 zorla\u015ft\u0131rabilir ve en \u00f6nemlisi, kullan\u0131c\u0131lar\u0131n uygulamadan so\u011fumas\u0131na neden olabilir. Bu nedenle, Angular projelerinde kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn neden &#8220;da\u011f\u0131lma&#8221; e\u011filimi g\u00f6sterdi\u011fini anlamak ve bu sorunu nas\u0131l a\u015faca\u011f\u0131m\u0131z\u0131 \u00f6\u011frenmek hayati \u00f6nem ta\u015f\u0131maktad\u0131r.<\/p>\n<p>Modern web uygulamalar\u0131, genellikle birden \u00e7ok ekran\u0131 veya farkl\u0131 i\u015flevsellikleri tek bir taray\u0131c\u0131 penceresi i\u00e7inde bar\u0131nd\u0131r\u0131r. Bir e-ticaret uygulamas\u0131nda \u00fcr\u00fcn listesinden \u00fcr\u00fcn detay\u0131na ge\u00e7mek, bir bankac\u0131l\u0131k uygulamas\u0131nda hesap \u00f6zetinden para transferine gitmek veya bir sosyal medya platformunda ana sayfadan profil sayfas\u0131na ge\u00e7i\u015f yapmak, kullan\u0131c\u0131lar\u0131n al\u0131\u015fk\u0131n oldu\u011fu ak\u0131\u015flard\u0131r. Bu ge\u00e7i\u015flerin her biri, asl\u0131nda farkl\u0131 bir &#8220;g\u00f6r\u00fcn\u00fcm&#8221; sunar ve bu g\u00f6r\u00fcn\u00fcmlerin sorunsuz bir \u015fekilde y\u00fcklenmesi, de\u011fi\u015ftirilmesi ve durumu korunarak sunulmas\u0131 gerekmektedir. E\u011fer bu ge\u00e7i\u015fler manuel olarak, karma\u015f\u0131k <code>*ngIf<\/code> ko\u015fullar\u0131 veya CSS <code>display<\/code> \u00f6zellikleri ile y\u00f6netilmeye \u00e7al\u0131\u015f\u0131l\u0131rsa, uygulaman\u0131n UI&#8217;\u0131 adeta bir &#8220;kod spagettisine&#8221; d\u00f6n\u00fc\u015febilir. Bu durum, sadece geli\u015ftirme s\u00fcrecini yava\u015flatmakla kalmaz, ayn\u0131 zamanda uygulaman\u0131n hata yapmaya daha yatk\u0131n olmas\u0131na ve performans sorunlar\u0131 ya\u015famas\u0131na neden olur. \u0130\u015fte tam da bu noktada, Angular&#8217;\u0131n g\u00fc\u00e7l\u00fc rota y\u00f6netimi sistemi devreye girer ve uygulaman\u0131n UI&#8217;\u0131n\u0131 derli toplu, y\u00f6netilebilir ve performansl\u0131 bir \u015fekilde bir araya getirme potansiyeli sunar. \u015eimdi, Angular g\u00f6r\u00fcn\u00fcmlerinin temel ta\u015flar\u0131n\u0131 ve neden bazen bu ta\u015flar\u0131n yerinden oynad\u0131\u011f\u0131n\u0131 daha yak\u0131ndan inceleyelim.<\/p>\n<h3>Angular G\u00f6r\u00fcn\u00fcmleri ve Bile\u015fen Yap\u0131s\u0131: Temel Ta\u015flar Nelerdir?<\/h3>\n<p>Angular d\u00fcnyas\u0131nda, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn (UI) temel yap\u0131 ta\u015f\u0131 bile\u015fenlerdir (components). Her Angular uygulamas\u0131, k\u00f6k bile\u015fenden (AppComponent) ba\u015flayarak hiyerar\u015fik bir a\u011fa\u00e7 yap\u0131s\u0131 olu\u015fturur. Bu bile\u015fenler, kendi HTML \u015fablonlar\u0131, stil bilgileri ve TypeScript mant\u0131klar\u0131 ile uygulaman\u0131n belirli bir b\u00f6l\u00fcm\u00fcn\u00fc temsil eder. \u00d6rne\u011fin, bir web sayfas\u0131nda gezinme \u00e7ubu\u011fu, kenar \u00e7ubu\u011fu, ana i\u00e7erik alan\u0131 ve altbilgi gibi farkl\u0131 alanlar, ayr\u0131 ayr\u0131 bile\u015fenler olarak tasarlanabilir. Bu mod\u00fcler yap\u0131, kodun yeniden kullan\u0131labilirli\u011fini art\u0131r\u0131r ve karma\u015f\u0131k aray\u00fczlerin daha y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar. Ancak, bu mod\u00fclerli\u011fin faydalar\u0131, bile\u015fenlerin do\u011fru \u015fekilde organize edilmemesi veya aralar\u0131ndaki ge\u00e7i\u015flerin iyi planlanmamas\u0131 durumunda kolayca g\u00f6lgelenebilir.<\/p>\n<p>Uygulaman\u0131n genel g\u00f6r\u00fcn\u00fcm\u00fc veya &#8220;view&#8221; dedi\u011fimiz \u015fey, asl\u0131nda bu bile\u015fenlerin belirli bir d\u00fczen i\u00e7inde bir araya gelmesinden ibarettir. \u00d6rne\u011fin, bir &#8220;\u00dcr\u00fcn Detay Sayfas\u0131&#8221; g\u00f6r\u00fcn\u00fcm\u00fc, <code>ProductImageComponent<\/code>, <code>ProductDescriptionComponent<\/code>, <code>AddToCartButtonComponent<\/code> ve <code>RelatedProductsComponent<\/code> gibi birden \u00e7ok bile\u015fenin birle\u015fimi olabilir. Geli\u015ftiriciler olarak, bu bile\u015fenleri kullanarak sayfan\u0131n farkl\u0131 durumlar\u0131n\u0131 veya &#8220;ekranlar\u0131n\u0131&#8221; olu\u015ftururuz. Ancak, e\u011fer uygulaman\u0131zda farkl\u0131 &#8220;sayfalar&#8221; veya &#8220;b\u00f6l\u00fcmler&#8221; aras\u0131nda ge\u00e7i\u015f yapmak i\u00e7in sadece <code>*ngIf<\/code> direktifleri veya CSS <code>[hidden]<\/code> \u00f6zelliklerini kullan\u0131yorsan\u0131z, potansiyel bir karma\u015faya davetiye \u00e7\u0131kar\u0131yorsunuz demektir.<\/p>\n<p>Bir e-ticaret uygulamas\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcn. Kullan\u0131c\u0131 &#8220;Anasayfa&#8221;, &#8220;\u00dcr\u00fcnler&#8221;, &#8220;Sepet&#8221; ve &#8220;\u00d6deme&#8221; gibi farkl\u0131 b\u00f6l\u00fcmlere gidebilir. E\u011fer t\u00fcm bu g\u00f6r\u00fcn\u00fcmleri tek bir bile\u015fen i\u00e7inde, \u00f6rne\u011fin <code>AppComponent<\/code> i\u00e7inde y\u00f6netmeye kalkarsan\u0131z, bu bile\u015fenin \u015fablonu devasa boyutlara ula\u015f\u0131r. \u0130\u00e7 i\u00e7e ge\u00e7mi\u015f <code>*ngIf<\/code>&#8216;ler, hangi bile\u015fenin ne zaman g\u00f6r\u00fcnece\u011fini belirlemek i\u00e7in karma\u015f\u0131k ko\u015fullar yarat\u0131r.<\/p>\n<pre><code class=\"language-html\"><!-- AppComponent&#039;in \u015eablonu (Yanl\u0131\u015f Yakla\u015f\u0131m \u00d6rne\u011fi) -->\n<app-header><\/app-header>\n\n<div *ngIf=\"currentPage === &#039;home&#039;\">\n  <app-home-page><\/app-home-page>\n<\/div>\n\n<div *ngIf=\"currentPage === &#039;products&#039;\">\n  <app-product-list><\/app-product-list>\n<\/div>\n\n<div *ngIf=\"currentPage === &#039;product-detail&#039; &#038;&#038; selectedProductId\">\n  <app-product-detail [productId]=\"selectedProductId\"><\/app-product-detail>\n<\/div>\n\n<div *ngIf=\"currentPage === &#039;cart&#039;\">\n  <app-cart><\/app-cart>\n<\/div>\n\n<div *ngIf=\"currentPage === &#039;checkout&#039;\">\n  <app-checkout><\/app-checkout>\n<\/div>\n\n<app-footer><\/app-footer><\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki senaryoda, <code>AppComponent<\/code> i\u00e7indeki <code>currentPage<\/code> de\u011fi\u015fkeninin de\u011ferine g\u00f6re farkl\u0131 bile\u015fenler g\u00f6sterilip gizleniyor. Bu yakla\u015f\u0131m, ba\u015flang\u0131\u00e7ta k\u00fc\u00e7\u00fck uygulamalar i\u00e7in i\u015fe yarasa da, uygulama b\u00fcy\u00fcd\u00fck\u00e7e ciddi sorunlara yol a\u00e7ar:<\/p>\n<p>*   <strong>Performans Sorunlar\u0131:<\/strong> <code>*ngIf<\/code> kullan\u0131ld\u0131\u011f\u0131nda, gizlenen bile\u015fenler genellikle DOM'dan kald\u0131r\u0131l\u0131r ve tekrar g\u00f6sterildi\u011finde yeniden olu\u015fturulur. Bu, \u00f6zellikle karma\u015f\u0131k veya veri a\u00e7\u0131s\u0131ndan zengin bile\u015fenler i\u00e7in pahal\u0131 bir i\u015flemdir ve sayfa ge\u00e7i\u015flerinde g\u00f6zle g\u00f6r\u00fcl\u00fcr gecikmelere neden olabilir. Ayr\u0131ca, DOM'da s\u00fcrekli olarak eleman ekleyip \u00e7\u0131karmak, taray\u0131c\u0131 \u00fczerinde ek y\u00fck olu\u015fturur.<br \/>\n*   <strong>Durum Y\u00f6netimi Zorluklar\u0131:<\/strong> Bir bile\u015fen gizlendi\u011finde, i\u00e7erisindeki t\u00fcm durumu (state) kaybeder. \u00d6rne\u011fin, kullan\u0131c\u0131 bir \u00fcr\u00fcn listesinde belirli bir filtre uygulad\u0131ktan sonra ba\u015fka bir sayfaya gidip geri d\u00f6nd\u00fc\u011f\u00fcnde, filtre ayarlar\u0131n\u0131n s\u0131f\u0131rlanm\u0131\u015f oldu\u011funu g\u00f6rebilir. Bu, k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimine yol a\u00e7ar. Durumu manuel olarak saklamak ve geri y\u00fcklemek ise kod karma\u015fas\u0131n\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>URL B\u00fct\u00fcnl\u00fc\u011f\u00fc Eksikli\u011fi:<\/strong> Taray\u0131c\u0131 URL'si, uygulaman\u0131n mevcut durumunu yans\u0131tmaz. Kullan\u0131c\u0131 bir sayfay\u0131 yer imlerine ekleyemez, ba\u011flant\u0131y\u0131 payla\u015famaz veya taray\u0131c\u0131n\u0131n geri\/ileri tu\u015flar\u0131n\u0131 bekledi\u011fi gibi kullanamaz. Bu, bir web uygulamas\u0131n\u0131n temel beklentilerinden birini kar\u015f\u0131lamad\u0131\u011f\u0131 anlam\u0131na gelir.<br \/>\n*   <strong>Bak\u0131m Zorlu\u011fu:<\/strong> Tek bir bile\u015fen i\u00e7inde y\u00fczlerce sat\u0131r HTML ve TypeScript mant\u0131\u011f\u0131 olmas\u0131, kodu anlamay\u0131, hata ay\u0131klamay\u0131 ve yeni \u00f6zellikler eklemeyi kabusa \u00e7evirir. Kod karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a, yeni hatalar\u0131n ortaya \u00e7\u0131kma olas\u0131l\u0131\u011f\u0131 da y\u00fckselir.<\/p>\n<p>Bu sorunlar, uygulaman\u0131n UI'\u0131n\u0131n \"da\u011f\u0131lmas\u0131na\" neden olur; yani, beklenen ak\u0131c\u0131l\u0131\u011f\u0131 ve tutarl\u0131l\u0131\u011f\u0131 sa\u011flayamaz, performans d\u00fc\u015fer ve geli\u015ftiriciler i\u00e7in y\u00f6netim zorlu\u011fu yarat\u0131r. \u0130\u015fte bu noktada, Angular'\u0131n yerle\u015fik rota y\u00f6netimi sistemi, bu t\u00fcr sorunlar\u0131 k\u00f6k\u00fcnden \u00e7\u00f6zmek i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/p>\n<h3>Tek Sayfa Uygulamalar\u0131nda (SPA) Gezinme Zorluklar\u0131: UI Karma\u015fas\u0131 Nas\u0131l Ba\u015flar?<\/h3>\n<p>Tek Sayfa Uygulamalar\u0131 (SPA), modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir. Bir SPA, kullan\u0131c\u0131ya taray\u0131c\u0131da tek bir HTML sayfas\u0131 y\u00fcklendi\u011fi izlenimi verir ve daha sonra i\u00e7erik, JavaScript arac\u0131l\u0131\u011f\u0131yla dinamik olarak g\u00fcncellenir. Bu yakla\u015f\u0131m, geleneksel \u00e7ok sayfal\u0131 uygulamalara g\u00f6re daha ak\u0131c\u0131 bir kullan\u0131c\u0131 deneyimi sunar \u00e7\u00fcnk\u00fc her etkile\u015fimde t\u00fcm sayfan\u0131n yeniden y\u00fcklenmesi gerekmez. Ancak, bu ak\u0131c\u0131l\u0131\u011f\u0131n bir bedeli vard\u0131r: uygulaman\u0131n farkl\u0131 \"ekranlar\u0131\" veya \"b\u00f6l\u00fcmleri\" aras\u0131nda gezinme mant\u0131\u011f\u0131n\u0131 dikkatli bir \u015fekilde y\u00f6netmek zorunludur. E\u011fer bu y\u00f6netim do\u011fru yap\u0131lmazsa, SPA'n\u0131n getirdi\u011fi avantajlar dezavantajlara d\u00f6n\u00fc\u015febilir ve UI karma\u015fas\u0131 ka\u00e7\u0131n\u0131lmaz hale gelir.<\/p>\n<p>UI karma\u015fas\u0131 genellikle, uygulaman\u0131n farkl\u0131 b\u00f6l\u00fcmlerini g\u00f6stermek veya gizlemek i\u00e7in <code>*ngIf<\/code> veya <code>[hidden]<\/code> gibi yap\u0131sal direktiflerin a\u015f\u0131r\u0131 kullan\u0131m\u0131yla ba\u015flar. Ba\u015flang\u0131\u00e7ta k\u00fc\u00e7\u00fck \u00f6l\u00e7ekli projelerde bu pratik, h\u0131zl\u0131 prototipleme i\u00e7in uygun ve kolay g\u00f6r\u00fcnebilir. \u00d6rne\u011fin, bir \"Ayarlar\" sayfas\u0131nda \"Profil Bilgileri\", \"G\u00fcvenlik\" ve \"Bildirimler\" gibi \u00fc\u00e7 farkl\u0131 sekme aras\u0131nda ge\u00e7i\u015f yapt\u0131\u011f\u0131n\u0131z\u0131 d\u00fc\u015f\u00fcnelim. Her sekmeyi ayr\u0131 bir bile\u015fen olarak tasarlayabilir ve aktif sekmeye g\u00f6re ilgili bile\u015feni <code>*ngIf<\/code> ile g\u00f6sterebilirsiniz.<\/p>\n<pre><code class=\"language-html\"><!-- Ayarlar Sayfas\u0131 Bile\u015feninin \u015eablonu -->\n<nav>\n  <button (click)=\"setActiveTab(&#039;profile&#039;)\">Profil<\/button>\n  <button (click)=\"setActiveTab(&#039;security&#039;)\">G\u00fcvenlik<\/button>\n  <button (click)=\"setActiveTab(&#039;notifications&#039;)\">Bildirimler<\/button>\n<\/nav>\n\n<div *ngIf=\"activeTab === &#039;profile&#039;\">\n  <app-profile-settings><\/app-profile-settings>\n<\/div>\n\n<div *ngIf=\"activeTab === &#039;security&#039;\">\n  <app-security-settings><\/app-security-settings>\n<\/div>\n\n<div *ngIf=\"activeTab === &#039;notifications&#039;\">\n  <app-notification-settings><\/app-notification-settings>\n<\/div><\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnek, \u00fc\u00e7 basit sekme i\u00e7in i\u015fe yarayabilir. Ancak uygulama b\u00fcy\u00fcd\u00fck\u00e7e, bu \" <code>*ngIf<\/code> cehennemi\" h\u0131zla sorunlara yol a\u00e7ar:<\/p>\n<p>1.  <strong>Performans Sorunlar\u0131 ve Yava\u015f Sayfa Ge\u00e7i\u015fleri:<\/strong> Her <code>*ngIf<\/code> ko\u015fulu de\u011fi\u015fti\u011finde, gizlenen bile\u015fenler DOM'dan kald\u0131r\u0131l\u0131r ve tekrar g\u00f6sterildi\u011finde yeniden olu\u015fturulur. E\u011fer bir bile\u015fen a\u011fac\u0131n\u0131n derinlikleri veya bile\u015fenin kendisi \u00e7ok karma\u015f\u0131ksa (\u00f6rne\u011fin, b\u00fcy\u00fck bir tablo veya bir\u00e7ok form eleman\u0131 i\u00e7eren bir bile\u015fen), bu yeniden olu\u015fturma i\u015flemi olduk\u00e7a pahal\u0131 olabilir. Kullan\u0131c\u0131 bir sekmeden di\u011ferine her ge\u00e7ti\u011finde, k\u00fc\u00e7\u00fck bir gecikme ya\u015far. Bu gecikmeler birikerek genel kullan\u0131c\u0131 deneyimini olumsuz etkiler. Yava\u015f y\u00fcklenen Angular uygulamalar\u0131, kullan\u0131c\u0131lar\u0131n sabr\u0131n\u0131 zorlayabilir.<\/p>\n<p>2.  <strong>Durum Kayb\u0131:<\/strong> Bir bile\u015fen DOM'dan kald\u0131r\u0131ld\u0131\u011f\u0131nda, i\u00e7indeki t\u00fcm ge\u00e7ici veriler ve form durumlar\u0131 kaybolur. Kullan\u0131c\u0131 bir form doldururken yanl\u0131\u015fl\u0131kla ba\u015fka bir sekmeye t\u0131klasa ve geri d\u00f6nse, t\u00fcm girmi\u015f oldu\u011fu verileri kaybetmi\u015f olur. Bu, kullan\u0131c\u0131 i\u00e7in b\u00fcy\u00fck bir hayal k\u0131r\u0131kl\u0131\u011f\u0131 ve verimlilik kayb\u0131 demektir. Geli\u015ftiricilerin bu durumu manuel olarak kaydetmek ve geri y\u00fcklemek i\u00e7in ek kod yazmas\u0131 gerekir ki bu da karma\u015f\u0131kl\u0131\u011f\u0131 art\u0131r\u0131r.<\/p>\n<p>3.  <strong>URL ve Taray\u0131c\u0131 Ge\u00e7mi\u015fi ile Uyumsuzluk:<\/strong> <code>*ngIf<\/code> tabanl\u0131 gezinme, taray\u0131c\u0131n\u0131n URL \u00e7ubu\u011funu veya ge\u00e7mi\u015fini etkilemez. Uygulaman\u0131n farkl\u0131 \"sayfalar\u0131\" veya \"durumlar\u0131\" aras\u0131nda gezinirken URL de\u011fi\u015fmez. Bu durum, \u015fu temel SPA beklentilerini kar\u015f\u0131layamaz:<br \/>\n    *   <strong>Payla\u015f\u0131labilirlik:<\/strong> Kullan\u0131c\u0131, bakt\u0131\u011f\u0131 spesifik bir g\u00f6r\u00fcn\u00fcm\u00fcn URL'sini arkada\u015flar\u0131yla payla\u015famaz.<br \/>\n    *   <strong>Yer \u0130\u015faretleri:<\/strong> Kullan\u0131c\u0131, be\u011fendi\u011fi bir sayfay\u0131 taray\u0131c\u0131s\u0131na yer i\u015fareti olarak kaydedemez.<br \/>\n    *   <strong>Taray\u0131c\u0131 Geri\/\u0130leri D\u00fc\u011fmeleri:<\/strong> Geri ve ileri d\u00fc\u011fmeleri, uygulaman\u0131n i\u00e7indeki durum de\u011fi\u015fikliklerini de\u011fil, sadece taray\u0131c\u0131 ge\u00e7mi\u015fini yans\u0131t\u0131r. Bu, kullan\u0131c\u0131lar\u0131n bekledi\u011fi sezgisel gezinme deneyimini bozar.<\/p>\n<p>4.  <strong>SEO Dostu Olmama:<\/strong> Arama motorlar\u0131 genellikle URL'ye g\u00f6re i\u00e7erik indeksler. Dinamik olarak <code>*ngIf<\/code> ile de\u011fi\u015ftirilen i\u00e7erik, arama motoru botlar\u0131 taraf\u0131ndan kolayca ke\u015ffedilemeyebilir veya indekslenemeyebilir. Bu da uygulaman\u0131n arama motoru s\u0131ralamalar\u0131n\u0131 olumsuz etkiler. SEO dostu SPA'lar i\u00e7in URL'lerin do\u011fru bir \u015fekilde y\u00f6netilmesi \u015fartt\u0131r.<\/p>\n<p><strong>Vaka Analizi: B\u00fcy\u00fck Bir Y\u00f6netim Paneli Uygulamas\u0131<\/strong><\/p>\n<p>Bir sa\u011fl\u0131k y\u00f6netim sistemi i\u00e7in geli\u015ftirilen bir y\u00f6netim paneli uygulamas\u0131n\u0131 hayal edin. Bu panelde \"Hasta Listesi\", \"Randevu Y\u00f6netimi\", \"Personel Kay\u0131tlar\u0131\", \"Analitik Raporlar\" ve \"Sistem Ayarlar\u0131\" gibi onlarca farkl\u0131 b\u00f6l\u00fcm bulunmaktad\u0131r. \u0130lk geli\u015ftirme a\u015famas\u0131nda, her b\u00f6l\u00fcm <code>*ngIf<\/code> ile kontrol edilen ayr\u0131 bir bile\u015fen olarak tasarlanm\u0131\u015ft\u0131. <code>AdminDashboardComponent<\/code> ad\u0131 verilen ana bile\u015fen, y\u00fczlerce sat\u0131r HTML ve onlarca <code>*ngIf<\/code> ko\u015fulu i\u00e7eriyordu.<\/p>\n<p>*   <strong>Sorun:<\/strong> Uygulama b\u00fcy\u00fcd\u00fck\u00e7e, her ge\u00e7i\u015fte hissedilir bir yava\u015fl\u0131k ortaya \u00e7\u0131kt\u0131. \u00d6zellikle raporlar b\u00f6l\u00fcm\u00fc gibi veri yo\u011fun k\u0131s\u0131mlarda, ge\u00e7i\u015fler 2-3 saniyeyi bulabiliyordu. Bir kullan\u0131c\u0131 \"Hasta Listesi\"nde arama yaparken \"Randevu Y\u00f6netimi\"ne ge\u00e7ip geri d\u00f6nd\u00fc\u011f\u00fcnde, arama sonu\u00e7lar\u0131n\u0131n kayboldu\u011funu fark ediyordu. Ayr\u0131ca, y\u00f6neticiler belirli bir raporun ba\u011flant\u0131s\u0131n\u0131 di\u011ferleriyle payla\u015fmakta zorlan\u0131yordu \u00e7\u00fcnk\u00fc URL her zaman ayn\u0131yd\u0131.<br \/>\n*   <strong>Sonu\u00e7:<\/strong> Kullan\u0131c\u0131lar yava\u015fl\u0131ktan ve durum kayb\u0131ndan \u015fikayet etmeye ba\u015flad\u0131. Geli\u015ftiriciler, <code>AdminDashboardComponent<\/code> i\u00e7indeki mant\u0131\u011f\u0131 anlamakta ve hata ay\u0131klamakta zorland\u0131lar, bu da yeni \u00f6zelliklerin geli\u015ftirilmesini yava\u015flatt\u0131. Uygulaman\u0131n bak\u0131m\u0131 bir kabusa d\u00f6n\u00fc\u015ft\u00fc ve genel kullan\u0131c\u0131 deneyimi ciddi \u015fekilde zarar g\u00f6rd\u00fc.<\/p>\n<p>Bu t\u00fcr senaryolar, Angular UI'\u0131n\u0131n nas\u0131l \"da\u011f\u0131laca\u011f\u0131n\u0131n\" tipik \u00f6rnekleridir. Ne yaz\u0131k ki, basit bir <code>*ngIf<\/code> kullan\u0131m\u0131yla ba\u015flayan bu durum, uygulaman\u0131n \u00f6l\u00e7eklenememesine ve y\u00f6netilemez hale gelmesine yol a\u00e7abilir. \u0130\u015fte bu noktada, Angular'\u0131n g\u00fc\u00e7l\u00fc rota y\u00f6netimi (routing) \u00e7\u00f6z\u00fcm\u00fc devreye girer ve bu karma\u015fay\u0131 d\u00fczenli bir yap\u0131ya d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<h3>Angular Rota Y\u00f6netimi (Routing): \u00c7\u00f6z\u00fcm\u00fcn Kalbi Nas\u0131l Atar?<\/h3>\n<p>Angular Rota Y\u00f6netimi (Router), Tek Sayfa Uygulamalar\u0131ndaki (SPA) gezinme zorluklar\u0131n\u0131 a\u015fmak i\u00e7in tasarlanm\u0131\u015f, g\u00fc\u00e7l\u00fc ve entegre bir sistemdir. Temelde, uygulaman\u0131n farkl\u0131 URL'lerini belirli Angular bile\u015fenleriyle e\u015fle\u015ftirerek \u00e7al\u0131\u015f\u0131r. Bu sayede, kullan\u0131c\u0131 bir URL'ye gitti\u011finde veya bir ba\u011flant\u0131ya t\u0131klad\u0131\u011f\u0131nda, Router devreye girer, ilgili bile\u015feni y\u00fckler ve taray\u0131c\u0131n\u0131n URL'sini ve ge\u00e7mi\u015fini g\u00fcnceller. Bu mekanizma, <code>*ngIf<\/code> tabanl\u0131 manuel g\u00f6r\u00fcn\u00fcm y\u00f6netiminin neden oldu\u011fu t\u00fcm sorunlar\u0131 k\u00f6kten \u00e7\u00f6zer ve uygulaman\u0131za ger\u00e7ek bir web deneyimi kazand\u0131r\u0131r.<\/p>\n<p>Angular Router'\u0131n temel amac\u0131, bir URL'yi uygulaman\u0131zdaki belirli bir bile\u015fenle ili\u015fkilendirmektir. Bu, uygulaman\u0131z\u0131n farkl\u0131 \"sayfalar\u0131\" veya \"ekranlar\u0131\" aras\u0131nda gezinme mant\u0131\u011f\u0131n\u0131 merkezile\u015ftirir ve standardize eder. \u0130\u015fte Angular Router'\u0131n temel faydalar\u0131 ve nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131na dair bir bak\u0131\u015f:<\/p>\n<p>1.  <strong>URL Kal\u0131c\u0131l\u0131\u011f\u0131 ve Payla\u015f\u0131labilirlik:<\/strong> Router, uygulaman\u0131n her \"sayfas\u0131n\u0131\" benzersiz bir URL ile e\u015fle\u015ftirir. Bu, kullan\u0131c\u0131lar\u0131n belirli bir g\u00f6r\u00fcn\u00fcme yer i\u015fareti koymas\u0131n\u0131, ba\u011flant\u0131y\u0131 kopyalay\u0131p ba\u015fkalar\u0131yla payla\u015fmas\u0131n\u0131 ve taray\u0131c\u0131n\u0131n geri\/ileri d\u00fc\u011fmelerini sezgisel olarak kullanmas\u0131n\u0131 sa\u011flar. Uygulama durumu art\u0131k sadece JavaScript'te de\u011fil, URL'de de yans\u0131t\u0131l\u0131r.<\/p>\n<p>2.  <strong>Mod\u00fclerlik ve Y\u00f6netilebilirlik:<\/strong> Her rota, belirli bir bile\u015fene veya bir bile\u015fen grubuna i\u015faret eder. Bu, kodunuzu daha mod\u00fcler hale getirir. Art\u0131k devasa bir <code>AppComponent<\/code> i\u00e7inde t\u00fcm uygulaman\u0131n g\u00f6r\u00fcn\u00fcm mant\u0131\u011f\u0131n\u0131 bar\u0131nd\u0131rmak yerine, her bir \"sayfa\" i\u00e7in ayr\u0131 bir bile\u015fen veya bir mod\u00fcl olu\u015fturabilir ve bunlar\u0131 rota ile ili\u015fkilendirebilirsiniz. Bu, kodun okunabilirli\u011fini, bak\u0131m\u0131n\u0131 ve hata ay\u0131klamas\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>3.  <strong>Performans \u0130yile\u015ftirmeleri (Lazy Loading):<\/strong> Router'\u0131n en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri, tembel y\u00fckleme (lazy loading) yetene\u011fidir. Uygulama ba\u015flat\u0131ld\u0131\u011f\u0131nda, t\u00fcm bile\u015fenleri ve mod\u00fclleri tek seferde y\u00fcklemek yerine, Router yaln\u0131zca o an ihtiya\u00e7 duyulan mod\u00fclleri ve bile\u015fenleri y\u00fckleyebilir. Di\u011fer mod\u00fcller, kullan\u0131c\u0131 ilgili rotaya gitti\u011finde arka planda dinamik olarak y\u00fcklenir. Bu, ilk y\u00fckleme s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salt\u0131r ve Angular uygulamas\u0131n\u0131n ba\u015flang\u0131\u00e7 performans\u0131n\u0131 dramatik bir \u015fekilde iyile\u015ftirir. B\u00fcy\u00fck uygulamalar i\u00e7in bu \u00f6zellik vazge\u00e7ilmezdir.<\/p>\n<p>4.  <strong>Durum Y\u00f6netimi:<\/strong> Router, rota ge\u00e7i\u015fleri s\u0131ras\u0131nda bile\u015fenlerin durumunu y\u00f6netmeye yard\u0131mc\u0131 olur. Bir bile\u015fen bir rotadan di\u011ferine ge\u00e7ildi\u011finde DOM'dan kald\u0131r\u0131lsa bile, Router genellikle yeni bir bile\u015fen olu\u015fturur. Ancak, ileri d\u00fczey router stratejileri ve servisler kullanarak, karma\u015f\u0131k durumlar\u0131 bile\u015fenler aras\u0131nda veya rota ge\u00e7i\u015fleri boyunca korumak m\u00fcmk\u00fcnd\u00fcr. Ayr\u0131ca, rota parametreleri (URL'deki dinamik k\u0131s\u0131mlar) arac\u0131l\u0131\u011f\u0131yla verileri bile\u015fenler aras\u0131nda aktarabiliriz.<\/p>\n<p>5.  <strong>Taray\u0131c\u0131 Ge\u00e7mi\u015fi Entegrasyonu:<\/strong> Angular Router, HTML5 History API'sini kullanarak taray\u0131c\u0131 ge\u00e7mi\u015fiyle sorunsuz bir \u015fekilde entegre olur. Bu, <code>history.pushState()<\/code> ve <code>history.replaceState()<\/code> gibi y\u00f6ntemleri kullanarak URL'yi de\u011fi\u015ftirmesini ve ge\u00e7mi\u015fe giri\u015f eklemesini veya mevcut giri\u015fi de\u011fi\u015ftirmesini sa\u011flar. Kullan\u0131c\u0131, taray\u0131c\u0131n\u0131n geri ve ileri d\u00fc\u011fmelerini kulland\u0131\u011f\u0131nda, Router devreye girer ve do\u011fru bile\u015feni g\u00f6r\u00fcnt\u00fcler.<\/p>\n<p><strong>Temel Rota Yap\u0131land\u0131rmas\u0131:<\/strong><\/p>\n<p>Angular uygulaman\u0131za rota eklemek i\u00e7in genellikle <code>app-routing.module.ts<\/code> ad\u0131nda ayr\u0131 bir mod\u00fcl kullan\u0131r\u0131z. Bu mod\u00fcl, uygulaman\u0131n k\u00f6k mod\u00fcl\u00fcnde (AppModule) i\u00e7e aktar\u0131l\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\/\/ app-routing.module.ts\nimport { NgModule } from &#039;@angular\/core&#039;;\nimport { RouterModule, Routes } from &#039;@angular\/router&#039;;\nimport { HomeComponent } from &#039;.\/home\/home.component&#039;;\nimport { ProductsComponent } from &#039;.\/products\/products.component&#039;;\nimport { ProductDetailComponent } from &#039;.\/product-detail\/product-detail.component&#039;;\nimport { NotFoundComponent } from &#039;.\/not-found\/not-found.component&#039;; \/\/ 404 sayfas\u0131 i\u00e7in\n\nconst routes: Routes = [\n  { path: &#039;&#039;, component: HomeComponent }, \/\/ Anasayfa\n  { path: &#039;products&#039;, component: ProductsComponent }, \/\/ \u00dcr\u00fcn listesi\n  { path: &#039;products\/:id&#039;, component: ProductDetailComponent }, \/\/ Dinamik \u00fcr\u00fcn detay sayfas\u0131\n  { path: &#039;**&#039;, component: NotFoundComponent } \/\/ E\u015fle\u015fmeyen t\u00fcm yollar i\u00e7in 404 sayfas\u0131\n];\n\n@NgModule({\n  imports: [RouterModule.forRoot(routes)],\n  exports: [RouterModule]\n})\nexport class AppRoutingModule { }<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte:<br \/>\n*   <code>path<\/code>: URL segmentini tan\u0131mlar. <code>&#039;&#039;<\/code> ana dizini temsil eder.<br \/>\n*   <code>component<\/code>: Belirtilen <code>path<\/code> ile e\u015fle\u015fti\u011finde y\u00fcklenecek bile\u015feni tan\u0131mlar.<br \/>\n*   <code>products\/:id<\/code>: <code>id<\/code> k\u0131sm\u0131 dinamik bir parametredir. \u00d6rne\u011fin, <code>\/products\/123<\/code> URL'sinde <code>123<\/code> de\u011feri <code>ProductDetailComponent<\/code> i\u00e7inde kullan\u0131labilir.<br \/>\n*   <code>**<\/code>: Bu, \"wildcard\" rotas\u0131d\u0131r ve tan\u0131ml\u0131 rotalardan hi\u00e7biriyle e\u015fle\u015fmeyen herhangi bir URL i\u00e7in kullan\u0131l\u0131r. Genellikle bir 404 \"Sayfa Bulunamad\u0131\" bile\u015fenini g\u00f6stermek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><strong><code>router-outlet<\/code> ile G\u00f6r\u00fcn\u00fcm Yerle\u015fimi:<\/strong><\/p>\n<p>Rotan\u0131n y\u00fcklenece\u011fi bile\u015fenler, genellikle <code>AppComponent<\/code> \u015fablonuna eklenen <code><router-outlet><\/router-outlet><\/code> direktifi sayesinde DOM'a yerle\u015ftirilir.<\/p>\n<pre><code class=\"language-html\"><!-- app.component.html -->\n<app-header><\/app-header>\n<nav>\n  <ul>\n    <li><a routerLink=\"\/\">Anasayfa<\/a><\/li>\n    <li><a routerLink=\"\/products\">\u00dcr\u00fcnler<\/a><\/li>\n  <\/ul>\n<\/nav>\n\n<router-outlet><\/router-outlet> <!-- Router taraf\u0131ndan y\u00fcklenen bile\u015fen burada g\u00f6r\u00fcn\u00fcr -->\n\n<app-footer><\/app-footer><\/pre>\n<p><\/code><\/p>\n<p>Kullan\u0131c\u0131 <code>routerLink<\/code> direktifi ile bir ba\u011flant\u0131ya t\u0131klad\u0131\u011f\u0131nda (veya taray\u0131c\u0131 adres \u00e7ubu\u011funa bir URL yazd\u0131\u011f\u0131nda), Angular Router uygun bile\u015feni bulur ve <code>router-outlet<\/code> i\u00e7ine yerle\u015ftirir. Bu sayede, sadece de\u011fi\u015fen i\u00e7erik g\u00fcncellenirken, <code>app-header<\/code> ve <code>app-footer<\/code> gibi sabit bile\u015fenler yerinde kal\u0131r. Bu, hem performans\u0131 art\u0131r\u0131r hem de tutarl\u0131 bir kullan\u0131c\u0131 deneyimi sa\u011flar.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Karma\u015f\u0131k navigasyon bar\u0131na sahip uygulamalar\u0131n\u0131zda, routerLink'i kullanarak navigasyon \u00f6\u011felerini dinamik olarak olu\u015fturabilirsiniz. B\u00f6ylece, rota tan\u0131m\u0131 de\u011fi\u015fti\u011finde men\u00fclerinizi manuel olarak g\u00fcncellemenize gerek kalmaz.\n<\/div>\n<p>Sonu\u00e7 olarak, Angular Router, UI karma\u015fas\u0131n\u0131 \u00e7\u00f6zmek i\u00e7in merkezi, standartla\u015ft\u0131r\u0131lm\u0131\u015f ve performansl\u0131 bir \u00e7\u00f6z\u00fcm sunar. Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kla\u015ft\u0131k\u00e7a, bu sistemin faydalar\u0131 daha da belirgin hale gelir. Bir sonraki b\u00f6l\u00fcmde, Router'\u0131n sundu\u011fu daha geli\u015fmi\u015f \u00f6zelliklere ve bunlar\u0131 uygulaman\u0131zda nas\u0131l kullanabilece\u011finize de\u011finece\u011fiz.<\/p>\n<h3>Geli\u015fmi\u015f Rota Y\u00f6netimi Teknikleri: Uygulaman\u0131z\u0131n Yap\u0131s\u0131n\u0131 Nas\u0131l G\u00fc\u00e7lendirirsiniz?<\/h3>\n<p>Angular Router'\u0131n sadece temel URL-bile\u015fen e\u015fle\u015ftirmesinden \u00e7ok daha fazlas\u0131n\u0131 sundu\u011funu belirtmek \u00f6nemlidir. Uygulaman\u0131z\u0131n \u00f6l\u00e7eklenebilirli\u011fini, g\u00fcvenli\u011fini ve performans\u0131n\u0131 art\u0131rmak i\u00e7in kullanabilece\u011finiz bir dizi geli\u015fmi\u015f \u00f6zellik mevcuttur. Bu teknikler, \u00f6zellikle b\u00fcy\u00fck ve kurumsal d\u00fczeydeki Angular uygulamalar\u0131 i\u00e7in vazge\u00e7ilmezdir.<\/p>\n<h4>Lazy Loading (Tembel Y\u00fckleme): Performans\u0131 Nas\u0131l Maksimize Edersiniz?<\/h4>\n<p>Daha \u00f6nce de bahsetti\u011fimiz gibi, tembel y\u00fckleme, Angular Router'\u0131n sundu\u011fu en \u00f6nemli performans optimizasyonlar\u0131ndan biridir. Geleneksel olarak, bir Angular uygulamas\u0131 ba\u015flat\u0131ld\u0131\u011f\u0131nda, t\u00fcm uygulama kodu tek seferde taray\u0131c\u0131ya indirilir. B\u00fcy\u00fck uygulamalar i\u00e7in bu, ilk y\u00fckleme s\u00fcresini uzatabilir ve kullan\u0131c\u0131 deneyimini olumsuz etkileyebilir. Tembel y\u00fckleme ile, uygulaman\u0131z\u0131n belirli mod\u00fcllerini (ve dolay\u0131s\u0131yla i\u00e7erdikleri bile\u015fenleri) yaln\u0131zca kullan\u0131c\u0131 ilgili rotaya gitti\u011finde y\u00fckleyebilirsiniz.<\/p>\n<p><strong>Nas\u0131l Yap\u0131l\u0131r?<\/strong><\/p>\n<p>1.  <strong>Mod\u00fcl Yap\u0131s\u0131:<\/strong> Tembel y\u00fcklenecek her \u00f6zellik alan\u0131 i\u00e7in ayr\u0131 bir Angular mod\u00fcl\u00fc (<code>.module.ts<\/code>) olu\u015fturman\u0131z gerekir. Bu mod\u00fcl, o \u00f6zelli\u011fe ait t\u00fcm bile\u015fenleri, servisleri ve rotalar\u0131 i\u00e7ermelidir.<br \/>\n2.  <strong><code>loadChildren<\/code> Kullan\u0131m\u0131:<\/strong> K\u00f6k rota yap\u0131land\u0131rman\u0131zda (genellikle <code>app-routing.module.ts<\/code>), <code>component<\/code> yerine <code>loadChildren<\/code> \u00f6zelli\u011fini kullan\u0131rs\u0131n\u0131z. Bu \u00f6zellik, tembel y\u00fcklenecek mod\u00fcl\u00fcn yolunu ve mod\u00fcl\u00fcn s\u0131n\u0131f ad\u0131n\u0131 belirtir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ app-routing.module.ts (k\u00f6k rotalar)\nimport { NgModule } from &#039;@angular\/core&#039;;\nimport { RouterModule, Routes } from &#039;@angular\/router&#039;;\n\nconst routes: Routes = [\n  { path: &#039;&#039;, redirectTo: &#039;\/dashboard&#039;, pathMatch: &#039;full&#039; },\n  { path: &#039;dashboard&#039;, loadChildren: () => import(&#039;.\/dashboard\/dashboard.module&#039;).then(m => m.DashboardModule) },\n  { path: &#039;admin&#039;, loadChildren: () => import(&#039;.\/admin\/admin.module&#039;).then(m => m.AdminModule) },\n  \/\/ ... di\u011fer rotalar\n];\n\n@NgModule({\n  imports: [RouterModule.forRoot(routes)],\n  exports: [RouterModule]\n})\nexport class AppRoutingModule { }<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>dashboard<\/code> ve <code>admin<\/code> mod\u00fclleri, yaln\u0131zca kullan\u0131c\u0131 ilgili URL'lere gitti\u011finde indirilecektir. Bu, uygulaman\u0131z\u0131n ilk y\u00fckleme boyutunu \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r ve daha h\u0131zl\u0131 bir ba\u015flang\u0131\u00e7 deneyimi sunar.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Lazy loading ile birlikte preloading stratejilerini (\u00d6n Y\u00fckleme) kullanarak kullan\u0131c\u0131 deneyimini daha da iyile\u015ftirebilirsiniz. <code>PreloadAllModules<\/code> veya \u00f6zel bir \u00f6n y\u00fckleme stratejisi ile, uygulaman\u0131z\u0131n bo\u015fta oldu\u011fu zamanlarda arka planda di\u011fer mod\u00fclleri y\u00fckleyerek, kullan\u0131c\u0131 ilgili rotaya t\u0131klad\u0131\u011f\u0131nda an\u0131nda ge\u00e7i\u015f sa\u011flayabilirsiniz.\n<\/div>\n<h4>Rota Koruyucular\u0131 (Route Guards): G\u00fcvenli\u011fi Nas\u0131l Sa\u011flars\u0131n\u0131z?<\/h4>\n<p>Rota koruyucular\u0131, belirli bir rotaya eri\u015fimi ko\u015fullu hale getirmek i\u00e7in kullan\u0131lan servislerdir. Kimlik do\u011frulama (authentication), yetkilendirme (authorization) veya formda kaydedilmemi\u015f de\u011fi\u015fiklikler gibi durumlarda kullan\u0131c\u0131y\u0131 y\u00f6nlendirmek veya eri\u015fimi engellemek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r.<\/p>\n<p><strong>Temel Rota Koruyucu T\u00fcrleri:<\/strong><\/p>\n<p>*   <strong><code>CanActivate<\/code>:<\/strong> Bir rotaya eri\u015filip eri\u015filemeyece\u011fini kontrol eder. Genellikle kullan\u0131c\u0131n\u0131n oturum a\u00e7m\u0131\u015f olup olmad\u0131\u011f\u0131n\u0131 veya belirli bir role sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong><code>CanDeactivate<\/code>:<\/strong> Bir rotadan ayr\u0131labilece\u011fini kontrol eder. \u00d6rne\u011fin, bir formda kaydedilmemi\u015f de\u011fi\u015fiklikler varsa kullan\u0131c\u0131ya uyar\u0131 vermek ve ayr\u0131lmas\u0131n\u0131 engellemek i\u00e7in kullan\u0131labilir.<br \/>\n*   <strong><code>CanLoad<\/code>:<\/strong> Tembel y\u00fcklenecek bir mod\u00fcl\u00fcn y\u00fcklenmesine izin verilip verilmeyece\u011fini kontrol eder. Bu, mod\u00fcl\u00fcn hassas veri i\u00e7ermesi durumunda gereksiz a\u011f isteklerini \u00f6nler.<\/p>\n<p><strong>\u00d6rnek <code>CanActivate<\/code> Koruyucusu:<\/strong><\/p>\n<pre><code class=\"language-typescript\">\/\/ auth.guard.ts\nimport { Injectable } from &#039;@angular\/core&#039;;\nimport { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router, UrlTree } from &#039;@angular\/router&#039;;\nimport { Observable } from &#039;rxjs&#039;;\nimport { AuthService } from &#039;.\/auth.service&#039;; \/\/ Varsay\u0131msal bir kimlik do\u011frulama servisi\n\n@Injectable({\n  providedIn: &#039;root&#039;\n})\nexport class AuthGuard implements CanActivate {\n  constructor(private authService: AuthService, private router: Router) {}\n\n  canActivate(\n    route: ActivatedRouteSnapshot,\n    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {\n    \n    if (this.authService.isLoggedIn()) {\n      return true; \/\/ Kullan\u0131c\u0131 giri\u015f yapm\u0131\u015fsa rotaya eri\u015fime izin ver\n    } else {\n      this.router.navigate([&#039;\/login&#039;]); \/\/ Giri\u015f yapmam\u0131\u015fsa login sayfas\u0131na y\u00f6nlendir\n      return false; \/\/ Rotaya eri\u015fimi engelle\n    }\n  }\n}<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-typescript\">Rota tan\u0131m\u0131nda koruyucuyu kullanmak:<\/pre>\n<p><\/code>\/\/ admin.module.ts i\u00e7indeki rotalar<br \/>\nimport { AuthGuard } from &#039;..\/auth.guard&#039;;<\/p>\n<p>const adminRoutes: Routes = [<br \/>\n  {<br \/>\n    path: &#039;panel&#039;,<br \/>\n    component: AdminDashboardComponent,<br \/>\n    canActivate: [AuthGuard] \/\/ Bu rotaya sadece AuthGuard izin verirse eri\u015filebilir<br \/>\n  }<br \/>\n];<\/code><\/p>\n<h4>\u00c7ocuk Rotalar (Child Routes): Karma\u015f\u0131k B\u00f6l\u00fcmleri Nas\u0131l Organize Edersiniz?<\/h4>\n<p>\u00c7ocuk rotalar, uygulaman\u0131z\u0131n hiyerar\u015fik yap\u0131s\u0131n\u0131 daha da derinle\u015ftirmek ve karma\u015f\u0131k b\u00f6l\u00fcmleri daha d\u00fczenli hale getirmek i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir kullan\u0131c\u0131 profil sayfas\u0131 alt\u0131nda \"Bilgileri D\u00fczenle\", \"\u015eifre De\u011fi\u015ftir\" ve \"Bildirim Ayarlar\u0131\" gibi alt b\u00f6l\u00fcmler olabilir. Bu alt b\u00f6l\u00fcmler, profil sayfas\u0131n\u0131n \u00e7ocuk rotalar\u0131 olarak tan\u0131mlanabilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ user-profile-routing.module.ts\nimport { NgModule } from &#039;@angular\/core&#039;;\nimport { RouterModule, Routes } from &#039;@angular\/router&#039;;\nimport { UserProfileComponent } from &#039;.\/user-profile\/user-profile.component&#039;;\nimport { EditProfileComponent } from &#039;.\/edit-profile\/edit-profile.component&#039;;\nimport { ChangePasswordComponent } from &#039;.\/change-password\/change-password.component&#039;;\n\nconst userRoutes: Routes = [\n  { \n    path: &#039;profile&#039;, \n    component: UserProfileComponent,\n    children: [ \/\/ \u00c7ocuk rotalar\n      { path: &#039;&#039;, redirectTo: &#039;details&#039;, pathMatch: &#039;full&#039; }, \/\/ \/profile&#039;a gidildi\u011finde details&#039;a y\u00f6nlendir\n      { path: &#039;details&#039;, component: EditProfileComponent },\n      { path: &#039;password&#039;, component: ChangePasswordComponent }\n    ]\n  }\n];\n\n@NgModule({\n  imports: [RouterModule.forChild(userRoutes)],\n  exports: [RouterModule]\n})\nexport class UserProfileRoutingModule { }<\/pre>\n<p><\/code><\/p>\n<p><code>UserProfileComponent<\/code> \u015fablonunda, \u00e7ocuk rotalar\u0131n y\u00fcklenece\u011fi ikinci bir <code><router-outlet><\/code> kullanman\u0131z gerekir:<\/p>\n<pre><code class=\"language-html\"><!-- user-profile.component.html -->\n<h2>Kullan\u0131c\u0131 Profili<\/h2>\n<nav>\n  <ul>\n    <li><a routerLink=\".\/details\">Bilgileri D\u00fczenle<\/a><\/li>\n    <li><a routerLink=\".\/password\">\u015eifre De\u011fi\u015ftir<\/a><\/li>\n  <\/ul>\n<\/nav>\n<router-outlet><\/router-outlet> <!-- \u00c7ocuk rotalar\u0131n bile\u015fenleri burada g\u00f6r\u00fcnecek --><\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131, URL'lerin <code>\/profile\/details<\/code> ve <code>\/profile\/password<\/code> gibi olmas\u0131na olanak tan\u0131r ve ilgili bile\u015fenleri ana <code>UserProfileComponent<\/code> i\u00e7inde render eder.<\/p>\n<h4>Rota Parametreleri ve Veri Aktar\u0131m\u0131: Dinamik \u0130\u00e7eri\u011fi Nas\u0131l Y\u00f6netirsiniz?<\/h4>\n<p>Rotan\u0131z\u0131n bir par\u00e7as\u0131 olarak dinamik verileri ge\u00e7mek i\u00e7in rota parametrelerini kullanabilirsiniz. \u00d6rne\u011fin, <code>\/products\/123<\/code> URL'sindeki <code>123<\/code> de\u011feri, \u00fcr\u00fcn\u00fcn ID'sini temsil eder ve <code>ProductDetailComponent<\/code> i\u00e7inde bu ID'ye g\u00f6re \u00fcr\u00fcn detaylar\u0131n\u0131 y\u00fcklemek i\u00e7in kullan\u0131labilir.<\/p>\n<p>Rota tan\u0131m\u0131nda <code>path: &#039;products\/:id&#039;<\/code> \u015feklinde <code>:id<\/code> ile parametre tan\u0131mlan\u0131r. Bile\u015fen i\u00e7inde bu parametreye <code>ActivatedRoute<\/code> servisi arac\u0131l\u0131\u011f\u0131yla eri\u015filir:<\/p>\n<pre><code class=\"language-typescript\">\/\/ product-detail.component.ts\nimport { Component, OnInit } from &#039;@angular\/core&#039;;\nimport { ActivatedRoute } from &#039;@angular\/router&#039;;\nimport { ProductService } from &#039;..\/product.service&#039;; \/\/ Varsay\u0131msal \u00fcr\u00fcn servisi\n\n@Component({\n  selector: &#039;app-product-detail&#039;,\n  templateUrl: &#039;.\/product-detail.component.html&#039;,\n  styleUrls: [&#039;.\/product-detail.component.css&#039;]\n})\nexport class ProductDetailComponent implements OnInit {\n  productId: string;\n  product: any;\n\n  constructor(private route: ActivatedRoute, private productService: ProductService) { }\n\n  ngOnInit(): void {\n    \/\/ URL parametresini al\n    this.route.paramMap.subscribe(params => {\n      this.productId = params.get(&#039;id&#039;);\n      this.loadProductDetails(this.productId);\n    });\n  }\n\n  loadProductDetails(id: string): void {\n    this.productService.getProductById(id).subscribe(data => {\n      this.product = data;\n    });\n  }\n}<\/pre>\n<p><\/code><\/p>\n<p>Bu geli\u015fmi\u015f rota y\u00f6netimi teknikleri, Angular uygulaman\u0131z\u0131n hem mimarisini g\u00fc\u00e7lendirir hem de kullan\u0131c\u0131lar i\u00e7in daha g\u00fcvenli, h\u0131zl\u0131 ve ak\u0131c\u0131 bir deneyim sunar. Bir sonraki b\u00f6l\u00fcmde, t\u00fcm bu bilgileri birle\u015ftirerek ger\u00e7ek bir senaryoda sa\u011flam bir UI'\u0131n nas\u0131l olu\u015fturulabilece\u011fine bakaca\u011f\u0131z.<\/p>\n<h3>Uygulamal\u0131 Bir Senaryo: Entegre Rota Y\u00f6netimi ile Sa\u011flam Bir UI Olu\u015fturma<\/h3>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi bir araya getirerek, karma\u015f\u0131k bir <code>*ngIf<\/code> y\u0131\u011f\u0131n\u0131na ba\u011f\u0131ml\u0131 kalmadan, Angular rota y\u00f6netimi ile nas\u0131l sa\u011flam, performansl\u0131 ve kullan\u0131c\u0131 dostu bir UI olu\u015fturabilece\u011fimizi g\u00f6steren pratik bir senaryoya odaklanal\u0131m: Basit bir Blog Uygulamas\u0131. Bu uygulama, ana sayfa, g\u00f6nderi listesi, tek bir g\u00f6nderinin detay\u0131 ve hakk\u0131m\u0131zda sayfas\u0131 gibi temel b\u00f6l\u00fcmlere sahip olacak.<\/p>\n<p><strong>Senaryo: Basit Bir Blog Uygulamas\u0131<\/strong><\/p>\n<p>Amac\u0131m\u0131z, a\u015fa\u011f\u0131daki rotalar\u0131 destekleyen bir blog uygulamas\u0131 olu\u015fturmakt\u0131r:<\/p>\n<p>*   <code>\/<\/code>: Anasayfa<br \/>\n*   <code>\/posts<\/code>: T\u00fcm blog g\u00f6nderilerinin listesi<br \/>\n*   <code>\/posts\/:id<\/code>: Belirli bir blog g\u00f6nderisinin detay\u0131 (<code>:id<\/code> dinamik bir parametre olacak)<br \/>\n*   <code>\/about<\/code>: Hakk\u0131m\u0131zda sayfas\u0131<\/p>\n<p><strong>Ad\u0131m 1: Temel Bile\u015fenleri Olu\u015fturma<\/strong><\/p>\n<p>\u0130lk olarak, her bir sayfa i\u00e7in gerekli temel bile\u015fenleri olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">ng generate component home\nng generate component post-list\nng generate component post-detail\nng generate component about\nng generate component not-found # 404 sayfas\u0131 i\u00e7in<\/pre>\n<p><\/code><\/p>\n<p><strong>Ad\u0131m 2: Rota Yap\u0131land\u0131rmas\u0131n\u0131 Olu\u015fturma (<code>app-routing.module.ts<\/code>)<\/strong><\/p>\n<p>Uygulaman\u0131n ana rota mod\u00fcl\u00fcn\u00fc (<code>app-routing.module.ts<\/code>) a\u015fa\u011f\u0131daki gibi yap\u0131land\u0131r\u0131n:<\/p>\n<pre><code class=\"language-typescript\">\/\/ app-routing.module.ts\nimport { NgModule } from &#039;@angular\/core&#039;;\nimport { RouterModule, Routes } from &#039;@angular\/router&#039;;\n\n\/\/ Olu\u015fturdu\u011fumuz bile\u015fenleri import ediyoruz\nimport { HomeComponent } from &#039;.\/home\/home.component&#039;;\nimport { PostListComponent } from &#039;.\/post-list\/post-list.component&#039;;\nimport { PostDetailComponent } from &#039;.\/post-detail\/post-detail.component&#039;;\nimport { AboutComponent } from &#039;.\/about\/about.component&#039;;\nimport { NotFoundComponent } from &#039;.\/not-found\/not-found.component&#039;;\n\nconst routes: Routes = [\n  { path: &#039;&#039;, component: HomeComponent, title: &#039;Blog Anasayfa&#039; }, \/\/ Anasayfa\n  { path: &#039;posts&#039;, component: PostListComponent, title: &#039;Blog G\u00f6nderileri&#039; }, \/\/ G\u00f6nderi listesi\n  { path: &#039;posts\/:id&#039;, component: PostDetailComponent, title: &#039;G\u00f6nderi Detay\u0131&#039; }, \/\/ Dinamik g\u00f6nderi detay\u0131\n  { path: &#039;about&#039;, component: AboutComponent, title: &#039;Hakk\u0131m\u0131zda&#039; }, \/\/ Hakk\u0131m\u0131zda sayfas\u0131\n  { path: &#039;**&#039;, component: NotFoundComponent, title: &#039;Sayfa Bulunamad\u0131&#039; } \/\/ E\u015fle\u015fmeyen t\u00fcm yollar i\u00e7in 404\n];\n\n@NgModule({\n  imports: [RouterModule.forRoot(routes)],\n  exports: [RouterModule]\n})\nexport class AppRoutingModule { }<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Angular 14 ve sonras\u0131 ile birlikte, rota tan\u0131mlar\u0131na <code>title<\/code> \u00f6zelli\u011fi ekleyerek taray\u0131c\u0131 sekmesindeki ba\u015fl\u0131\u011f\u0131 dinamik olarak ayarlayabilirsiniz. Bu, SEO i\u00e7in \u00f6nemli bir katk\u0131 sa\u011flar ve kullan\u0131c\u0131 deneyimini iyile\u015ftirir.\n<\/div>\n<p><strong>Ad\u0131m 3: <code>AppComponent<\/code> \u015eablonunu G\u00fcncelleme<\/strong><\/p>\n<p><code>AppComponent<\/code> \u015fablonumuz, uygulaman\u0131n genel d\u00fczenini (header, navigation, footer) ve rota taraf\u0131ndan y\u00fcklenen i\u00e7eri\u011fin yerle\u015ftirilece\u011fi <code>router-outlet<\/code>'i i\u00e7erecektir.<\/p>\n<pre><code class=\"language-html\"><!-- app.component.html -->\n<header>\n  <h1>Basit Blog Uygulamas\u0131<\/h1>\n  <nav>\n    <ul>\n      <li><a routerLink=\"\/\" routerLinkActive=\"active\" [routerLinkActiveOptions]=\"{exact: true}\">Anasayfa<\/a><\/li>\n      <li><a routerLink=\"\/posts\" routerLinkActive=\"active\">G\u00f6nderiler<\/a><\/li>\n      <li><a routerLink=\"\/about\" routerLinkActive=\"active\">Hakk\u0131m\u0131zda<\/a><\/li>\n    <\/ul>\n  <\/nav>\n<\/header>\n\n<main>\n  <router-outlet><\/router-outlet> <!-- Rota taraf\u0131ndan y\u00fcklenen bile\u015fenler burada render edilecek -->\n<\/main>\n\n<footer>\n  <p>\u00a9 2023 Blog Uygulamas\u0131<\/p>\n<\/footer><\/pre>\n<p><\/code><\/p>\n<p>Burada <code>routerLink<\/code> direktifi, ilgili rotaya gitmek i\u00e7in kullan\u0131l\u0131rken, <code>routerLinkActive=\"active\"<\/code> CSS s\u0131n\u0131f\u0131, aktif olan ba\u011flant\u0131y\u0131 g\u00f6rsel olarak vurgulamak i\u00e7in eklenir. <code>[routerLinkActiveOptions]=\"{exact: true}\"<\/code> ise sadece tam e\u015fle\u015fme durumunda \"active\" s\u0131n\u0131f\u0131n\u0131n uygulanmas\u0131n\u0131 sa\u011flar, bu \u00f6zellikle anasayfa (<code>\/<\/code>) i\u00e7in \u00f6nemlidir.<\/p>\n<p><strong>Ad\u0131m 4: Dinamik G\u00f6nderi Detay\u0131n\u0131 \u0130\u015fleme (<code>post-detail.component.ts<\/code>)<\/strong><\/p>\n<p><code>PostDetailComponent<\/code> i\u00e7inde, URL'den g\u00f6nderi ID'sini al\u0131p ilgili g\u00f6nderinin detaylar\u0131n\u0131 bir servisten \u00e7ekebiliriz.<\/p>\n<pre><code class=\"language-typescript\">\/\/ post-detail.component.ts\nimport { Component, OnInit } from &#039;@angular\/core&#039;;\nimport { ActivatedRoute } from &#039;@angular\/router&#039;;\nimport { BlogService } from &#039;..\/blog.service&#039;; \/\/ Varsay\u0131msal bir blog servisi\n\n@Component({\n  selector: &#039;app-post-detail&#039;,\n  template: <code><div *ngIf=\"post\">\n      <h2>{{ post.title }}<\/h2>\n      <p>Yazar: {{ post.author }}<\/p>\n      <p>{{ post.content }}<\/p>\n      <a routerLink=\"\/posts\">T\u00fcm G\u00f6nderilere D\u00f6n<\/a>\n    <\/div>\n    <div *ngIf=\"!post\">\n      <p>G\u00f6nderi bulunamad\u0131.<\/p>\n    <\/div><\/code>,\n  styleUrls: [&#039;.\/post-detail.component.css&#039;]\n})\nexport class PostDetailComponent implements OnInit {\n  post: any;\n\n  constructor(private route: ActivatedRoute, private blogService: BlogService) { }\n\n  ngOnInit(): void {\n    this.route.paramMap.subscribe(params => {\n      const postId = params.get(&#039;id&#039;);\n      if (postId) {\n        this.blogService.getPostById(postId).subscribe(\n          data => this.post = data,\n          error => {\n            console.error(&#039;G\u00f6nderi y\u00fcklenirken hata olu\u015ftu:&#039;, error);\n            this.post = null; \/\/ G\u00f6nderi bulunamazsa post&#039;u null yap\n          }\n        );\n      }\n    });\n  }\n}<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>ActivatedRoute<\/code> servisi ile URL'deki <code>:id<\/code> parametresini al\u0131yoruz ve <code>blogService<\/code> \u00fczerinden o ID'ye sahip g\u00f6nderiyi \u00e7ekiyoruz.<\/p>\n<p><strong>Sonu\u00e7: Neden Bu Yakla\u015f\u0131m UI Karma\u015fas\u0131n\u0131 \u00c7\u00f6z\u00fcyor?<\/strong><\/p>\n<p>Bu entegre rota y\u00f6netimi yakla\u015f\u0131m\u0131, \u00f6nceki b\u00f6l\u00fcmde bahsetti\u011fimiz <code>*ngIf<\/code> tabanl\u0131 manuel gezinmenin t\u00fcm dezavantajlar\u0131n\u0131 ortadan kald\u0131r\u0131r:<\/p>\n<p>*   <strong>Temiz ve Mod\u00fcler Kod:<\/strong> Her sayfa veya \u00f6zellik alan\u0131 kendi bile\u015feni ve iste\u011fe ba\u011fl\u0131 olarak kendi mod\u00fcl\u00fc i\u00e7inde bulunur. <code>AppComponent<\/code> sadece ana d\u00fczeni ve <code><router-outlet><\/code>'i bar\u0131nd\u0131r\u0131r, bu da kodu \u00e7ok daha okunabilir ve y\u00f6netilebilir hale getirir.<br \/>\n*   <strong>Ak\u0131c\u0131 ve Performansl\u0131 Ge\u00e7i\u015fler:<\/strong> Angular Router, sadece de\u011fi\u015fmesi gereken bile\u015fenleri y\u00fckler ve render eder. \u00d6zellikle tembel y\u00fckleme (lazy loading) ile birlikte kullan\u0131ld\u0131\u011f\u0131nda, uygulaman\u0131n ilk y\u00fckleme s\u00fcresi k\u0131sal\u0131r ve sayfa ge\u00e7i\u015fleri anl\u0131k hale gelir.<br \/>\n*   <strong>URL B\u00fct\u00fcnl\u00fc\u011f\u00fc:<\/strong> Her \"sayfa\" veya \"g\u00f6r\u00fcn\u00fcm\" benzersiz bir URL'ye sahiptir. Kullan\u0131c\u0131lar sayfalar\u0131 yer imlerine ekleyebilir, payla\u015fabilir ve taray\u0131c\u0131n\u0131n geri\/ileri d\u00fc\u011fmelerini sorunsuz bir \u015fekilde kullanabilir. Bu, kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde geli\u015ftirir.<br \/>\n*   <strong>Geli\u015fmi\u015f \u00d6zellik Entegrasyonu:<\/strong> Bu yap\u0131ya kolayca rota koruyucular\u0131 (authentication i\u00e7in), rota \u00e7\u00f6z\u00fcmleyiciler (veri \u00f6n y\u00fckleme i\u00e7in) ve \u00e7ocuk rotalar (daha derin hiyerar\u015filer i\u00e7in) eklenebilir. Bu sayede uygulaman\u0131n esnekli\u011fi ve geni\u015fletilebilirli\u011fi artar.<\/p>\n<p>Bu basit blog uygulamas\u0131 senaryosu, Angular rota y\u00f6netiminin uygulaman\u0131z\u0131n UI'\u0131n\u0131 nas\u0131l d\u00fczenli, performansl\u0131 ve kullan\u0131c\u0131 dostu hale getirebilece\u011finin g\u00fc\u00e7l\u00fc bir \u00f6rne\u011fidir. Rota y\u00f6netimi, Angular geli\u015ftirmenin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r ve do\u011fru uyguland\u0131\u011f\u0131nda, uygulaman\u0131z\u0131n uzun vadeli ba\u015far\u0131s\u0131n\u0131n anahtar\u0131d\u0131r.<\/p>\n<h3>Performans ve Kullan\u0131c\u0131 Deneyimi \u0130\u00e7in \u0130pu\u00e7lar\u0131: Rota Optimizasyonu Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Angular Router, uygulaman\u0131z\u0131n sa\u011flam bir UI yap\u0131s\u0131na sahip olmas\u0131n\u0131 sa\u011flaman\u0131n yan\u0131 s\u0131ra, performans ve kullan\u0131c\u0131 deneyimini optimize etmek i\u00e7in de \u00e7e\u015fitli mekanizmalar sunar. Do\u011fru stratejilerle, SPA'n\u0131z\u0131n hem h\u0131zl\u0131 y\u00fcklenmesini hem de kullan\u0131c\u0131lar\u0131n her etkile\u015fimde sorunsuz bir deneyim ya\u015famas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<h4>Preloading Strategies (\u00d6n Y\u00fckleme Stratejileri): Kullan\u0131c\u0131y\u0131 Bekletmeyin<\/h4>\n<p>Lazy loading, ilk y\u00fckleme s\u00fcresini k\u0131saltmak i\u00e7in harika bir yoldur. Ancak, kullan\u0131c\u0131 tembel y\u00fcklenen bir rotaya ilk kez t\u0131klad\u0131\u011f\u0131nda yine de k\u00fc\u00e7\u00fck bir gecikme ya\u015fanabilir \u00e7\u00fcnk\u00fc mod\u00fcl o anda indirilmektedir. \u00d6n y\u00fckleme (preloading) stratejileri bu sorunu \u00e7\u00f6zer. Bu stratejiler, uygulaman\u0131n ba\u015flang\u0131c\u0131ndan hemen sonra veya bo\u015fta oldu\u011fu zamanlarda, di\u011fer tembel y\u00fcklenecek mod\u00fclleri arka planda indirerek, kullan\u0131c\u0131 o rotalara gitti\u011finde an\u0131nda ge\u00e7i\u015f yapmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>*   <strong><code>PreloadAllModules<\/code>:<\/strong> Angular taraf\u0131ndan sa\u011flanan en basit \u00f6n y\u00fckleme stratejisidir. Bu strateji, uygulaman\u0131n tamam\u0131 y\u00fcklendikten ve ba\u015flat\u0131ld\u0131ktan hemen sonra t\u00fcm tembel y\u00fcklenebilir mod\u00fclleri arka planda y\u00fckler. B\u00fcy\u00fck uygulamalar i\u00e7in dikkatli kullan\u0131lmal\u0131d\u0131r \u00e7\u00fcnk\u00fc \u00e7ok fazla mod\u00fcl\u00fcn ayn\u0131 anda y\u00fcklenmesi bant geni\u015fli\u011fini t\u00fcketebilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ app-routing.module.ts\n    import { PreloadAllModules } from &#039;@angular\/router&#039;;\n\n    @NgModule({\n      imports: [RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })],\n      exports: [RouterModule]\n    })\n    export class AppRoutingModule { }<\/pre>\n<p><\/code><\/p>\n<p>*   <strong>Custom Preloading Strategy:<\/strong> Daha ince taneli kontrol i\u00e7in kendi \u00f6zel \u00f6n y\u00fckleme stratejinizi yazabilirsiniz. Bu, \u00f6rne\u011fin sadece belirli mod\u00fclleri, belirli bir internet ba\u011flant\u0131 h\u0131z\u0131na sahip kullan\u0131c\u0131lar i\u00e7in veya g\u00fcn\u00fcn belirli saatlerinde y\u00fcklemek istedi\u011finizde faydal\u0131d\u0131r.<\/p>\n<h4>Route Reuse Strategy (Rota Yeniden Kullan\u0131m Stratejisi): Bile\u015fen Durumunu Koruyun<\/h4>\n<p>Varsay\u0131lan olarak, Angular Router bir rotadan ayr\u0131ld\u0131\u011f\u0131n\u0131zda bile\u015feni yok eder ve geri d\u00f6nd\u00fc\u011f\u00fcn\u00fczde yeniden olu\u015fturur. Bu, \u00f6zellikle bir listede filtreleme yapt\u0131ktan sonra detaya gidip geri d\u00f6nd\u00fc\u011f\u00fcn\u00fczde filtrenin s\u0131f\u0131rlanmas\u0131 gibi durumlarda k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimine yol a\u00e7abilir. Rota yeniden kullan\u0131m stratejileri, bu davran\u0131\u015f\u0131 \u00f6zelle\u015ftirmenize olanak tan\u0131r.<\/p>\n<p>\u00d6zel bir <code>RouteReuseStrategy<\/code> uygulayarak, Router'a belirli rotalar\u0131n DOM'dan kald\u0131r\u0131lmak yerine \u00f6nbelle\u011fe al\u0131nmas\u0131n\u0131 ve daha sonra ayn\u0131 rotaya geri d\u00f6n\u00fcld\u00fc\u011f\u00fcnde yeniden kullan\u0131lmas\u0131n\u0131 s\u00f6yleyebilirsiniz. Bu, bile\u015fenin durumunun korunmas\u0131n\u0131 sa\u011flar ve performans a\u00e7\u0131s\u0131ndan da faydal\u0131 olabilir \u00e7\u00fcnk\u00fc bile\u015fenin yeniden olu\u015fturulmas\u0131 gerekmez. Bu ileri d\u00fczey bir konudur ve dikkatli bir uygulama gerektirir.<\/p>\n<h4>Resolvers (\u00c7\u00f6z\u00fcmleyiciler): Verileri Rota Y\u00fcklenmeden \u00d6nce Getirin<\/h4>\n<p>Resolvers, bir rotaya gidilmeden \u00f6nce gerekli verilerin getirilmesini sa\u011flayan servislerdir. Bu sayede, bile\u015fen y\u00fcklendi\u011finde veriye haz\u0131r olur ve kullan\u0131c\u0131 bo\u015f bir ekran g\u00f6rmek yerine do\u011frudan i\u00e7erikle kar\u015f\u0131la\u015f\u0131r. Bu, \u00f6zellikle veri yo\u011fun sayfalarda y\u00fckleme g\u00f6stergelerini daha do\u011fru bir \u015fekilde y\u00f6netmenize yard\u0131mc\u0131 olur.<\/p>\n<p><strong>Nas\u0131l Kullan\u0131l\u0131r?<\/strong><\/p>\n<p>1.  <strong>Resolver Olu\u015fturma:<\/strong> <code>Resolve<\/code> aray\u00fcz\u00fcn\u00fc uygulayan bir servis olu\u015fturun. <code>resolve()<\/code> metodu, rotaya eri\u015fmeden \u00f6nce getirilecek veriyi d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-typescript\">\/\/ post.resolver.ts\n    import { Injectable } from &#039;@angular\/core&#039;;\n    import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from &#039;@angular\/router&#039;;\n    import { Observable } from &#039;rxjs&#039;;\n    import { BlogService } from &#039;.\/blog.service&#039;; \/\/ Varsay\u0131msal blog servisi\n\n    @Injectable({\n      providedIn: &#039;root&#039;\n    })\n    export class PostResolver implements Resolve<any> { \/\/ <code><any><\/code> yerine bir interface kullan\u0131lmal\u0131\n      constructor(private blogService: BlogService) {}\n\n      resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {\n        const postId = route.paramMap.get(&#039;id&#039;);\n        return this.blogService.getPostById(postId); \/\/ API \u00e7a\u011fr\u0131s\u0131n\u0131 d\u00f6nd\u00fcr\n      }\n    }<\/pre>\n<p><\/code><\/p>\n<p>2.  <strong>Rotaya Ekleyin:<\/strong> Resolver'\u0131 rota tan\u0131m\u0131n\u0131za <code>resolve<\/code> \u00f6zelli\u011fi olarak ekleyin.<\/p>\n<pre><code class=\"language-typescript\">\/\/ app-routing.module.ts\n    import { PostResolver } from &#039;.\/post.resolver&#039;;\n\n    const routes: Routes = [\n      { \n        path: &#039;posts\/:id&#039;, \n        component: PostDetailComponent, \n        resolve: { postData: PostResolver } \/\/ postData anahtar\u0131yla bile\u015fene eri\u015filebilir\n      },\n      \/\/ ... di\u011fer rotalar\n    ];<\/pre>\n<p><\/code><\/p>\n<p>3.  <strong>Bile\u015fen \u0130\u00e7inde Veriye Eri\u015fim:<\/strong> Bile\u015fen i\u00e7inde <code>ActivatedRoute<\/code> servisinden <code>data<\/code> \u00f6zelli\u011fini kullanarak \u00e7\u00f6z\u00fcmlenmi\u015f verilere eri\u015fin.<\/p>\n<pre><code class=\"language-typescript\">\/\/ post-detail.component.ts\n    import { Component, OnInit } from &#039;@angular\/core&#039;;\n    import { ActivatedRoute } from &#039;@angular\/router&#039;;\n\n    @Component({ \/* ... *\/ })\n    export class PostDetailComponent implements OnInit {\n      post: any;\n\n      constructor(private route: ActivatedRoute) { }\n\n      ngOnInit(): void {\n        this.route.data.subscribe(data => {\n          this.post = data.postData; \/\/ &#039;postData&#039; resolver&#039;da tan\u0131mlad\u0131\u011f\u0131m\u0131z anahtar\n        });\n      }\n    }<\/pre>\n<p><\/code><\/p>\n<p>Bu sayede, <code>PostDetailComponent<\/code> y\u00fcklendi\u011finde <code>this.post<\/code> zaten doldurulmu\u015f olacakt\u0131r.<\/p>\n<h4>Hata Y\u00f6netimi ve 404 Sayfalar\u0131: Kullan\u0131c\u0131y\u0131 K\u0131lavuzsuz B\u0131rakmay\u0131n<\/h4>\n<p>Kullan\u0131c\u0131lar\u0131n var olmayan bir URL'ye gitmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131nda veya bir rota parametresi yanl\u0131\u015f oldu\u011funda (\u00f6rne\u011fin, ge\u00e7ersiz bir \u00fcr\u00fcn ID'si), uygulaman\u0131z\u0131n do\u011fru \u015fekilde yan\u0131t vermesi \u00f6nemlidir.<\/p>\n<p>*   <strong><code><\/strong><\/code> Wildcard Rotas\u0131:<strong> Yukar\u0131da \u00f6rneklendi\u011fi gibi, <code><\/strong><\/code> yolu e\u015fle\u015fmeyen t\u00fcm rotalar\u0131 yakalar ve genellikle bir <code>NotFoundComponent<\/code>'e y\u00f6nlendirir. Bu, kullan\u0131c\u0131ya bilgilendirici bir 404 sayfas\u0131 sunarak uygulaman\u0131z\u0131n profesyonelli\u011fini art\u0131r\u0131r.<br \/>\n*   <strong>Resolver Hata Y\u00f6netimi:<\/strong> Resolver i\u00e7inde API \u00e7a\u011fr\u0131lar\u0131n\u0131n hatalar\u0131n\u0131 y\u00f6netmek \u00f6nemlidir. Bir resolver'\u0131n <code>resolve()<\/code> metodu bir hata d\u00f6nd\u00fcr\u00fcrse (bir <code>catchError<\/code> operat\u00f6r\u00fc ile), Router genellikle mevcut gezinmeyi iptal eder. Bu durumda, kullan\u0131c\u0131y\u0131 bir hata sayfas\u0131na y\u00f6nlendirmek veya \u00f6nceki sayfaya geri g\u00f6ndermek gibi \u00f6zel hata y\u00f6netimi uygulayabilirsiniz.<\/p>\n<p>Bu optimizasyon teknikleri, Angular Router'\u0131 sadece bir gezinme arac\u0131 olmaktan \u00e7\u0131kar\u0131p, uygulaman\u0131z\u0131n performans, g\u00fcvenlik ve kullan\u0131c\u0131 deneyimi stratejisinin merkezi bir par\u00e7as\u0131 haline getirir. Do\u011fru kullan\u0131ld\u0131klar\u0131nda, uygulaman\u0131z\u0131n UI'\u0131n\u0131n sadece sa\u011flam olmakla kalmay\u0131p, ayn\u0131 zamanda son derece verimli ve kullan\u0131c\u0131 dostu olmas\u0131n\u0131 sa\u011flarlar.<\/p>\n<h3>Sonu\u00e7: Angular Uygulamalar\u0131n\u0131zda Rota Y\u00f6netiminin Vazge\u00e7ilmez Rol\u00fc<\/h3>\n<p>Bu makale boyunca, Angular uygulamalar\u0131nda kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn (UI) neden \"da\u011f\u0131lma\" e\u011filimi g\u00f6sterdi\u011fini ve bu sorunlar\u0131n temelinde ne yatt\u0131\u011f\u0131n\u0131 detayl\u0131ca inceledik. Monolitik bile\u015fenler, <code>*ngIf<\/code> cehennemi, performans d\u00fc\u015f\u00fc\u015fleri, durum kayb\u0131 ve URL b\u00fct\u00fcnl\u00fc\u011f\u00fc eksikli\u011fi gibi sorunlar\u0131n, ba\u015flang\u0131\u00e7ta masum g\u00f6r\u00fcnen manuel gezinme yakla\u015f\u0131mlar\u0131ndan kaynakland\u0131\u011f\u0131n\u0131 g\u00f6rd\u00fck. Bu t\u00fcr yakla\u015f\u0131mlar, uygulaman\u0131z \u00f6l\u00e7eklendik\u00e7e ka\u00e7\u0131n\u0131lmaz olarak bak\u0131m zorluklar\u0131na, k\u00f6t\u00fc kullan\u0131c\u0131 deneyimine ve genel olarak uygulaman\u0131n karars\u0131z bir yap\u0131ya d\u00f6n\u00fc\u015fmesine yol a\u00e7ar.<\/p>\n<p>Ancak, Angular'\u0131n g\u00fc\u00e7l\u00fc ve esnek rota y\u00f6netim sistemi (Router), bu karma\u015faya bir son vermek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Router, URL'leri bile\u015fenlerle e\u015fle\u015ftirerek, uygulaman\u0131z\u0131n farkl\u0131 \"sayfalar\u0131\" aras\u0131nda gezinme mant\u0131\u011f\u0131n\u0131 merkezile\u015ftirir ve standartla\u015ft\u0131r\u0131r. Bu sayede:<\/p>\n<p>*   <strong>Mod\u00fcler ve Y\u00f6netilebilir Bir Mimari<\/strong> in\u015fa edersiniz.<br \/>\n*   <strong>Ak\u0131c\u0131 ve Performansl\u0131 Sayfa Ge\u00e7i\u015fleri<\/strong> sa\u011flars\u0131n\u0131z.<br \/>\n*   <strong>URL B\u00fct\u00fcnl\u00fc\u011f\u00fc ve Taray\u0131c\u0131 Ge\u00e7mi\u015fi Entegrasyonu<\/strong> ile modern web beklentilerini kar\u015f\u0131lars\u0131n\u0131z.<br \/>\n*   <strong>Lazy Loading<\/strong> sayesinde ilk y\u00fckleme s\u00fcrelerini dramatik bir \u015fekilde k\u0131saltarak performans\u0131 maksimize edersiniz.<br \/>\n*   <strong>Route Guards<\/strong> ile g\u00fcvenlik ve yetkilendirme katmanlar\u0131 eklersiniz.<br \/>\n*   <strong>Resolvers<\/strong> ile veri y\u00fcklemeyi optimize ederek kullan\u0131c\u0131ya her zaman haz\u0131r i\u00e7erik sunars\u0131n\u0131z.<br \/>\n*   <strong>\u00c7ocuk Rotalar<\/strong> ile karma\u015f\u0131k aray\u00fczleri mant\u0131ksal hiyerar\u015filere b\u00f6lersiniz.<\/p>\n<p>Angular geli\u015ftiricileri olarak, rota y\u00f6netiminin sadece bir \"opsiyon\" olmad\u0131\u011f\u0131n\u0131, aksine modern, sa\u011flam ve \u00f6l\u00e7eklenebilir bir Angular uygulamas\u0131n\u0131n temel direklerinden biri oldu\u011funu anlamal\u0131y\u0131z. Do\u011fru uyguland\u0131\u011f\u0131nda, rota y\u00f6netimi, uygulaman\u0131z\u0131n karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131r, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r, bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve en \u00f6nemlisi, kullan\u0131c\u0131lar\u0131n\u0131za ak\u0131c\u0131 ve keyifli bir deneyim sunar. Angular UI'\u0131n\u0131z\u0131n da\u011f\u0131lmas\u0131n\u0131 \u00f6nlemek ve onu daha g\u00fc\u00e7l\u00fc k\u0131lmak i\u00e7in rota y\u00f6netimini stratejik bir \u015fekilde benimsemek, projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>---<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Angular'da <code>*ngIf<\/code> kullanmak ne zaman problem yarat\u0131r?<\/strong><br \/>\n<code>*ngIf<\/code> direktifi, DOM elemanlar\u0131n\u0131 ko\u015fullu olarak olu\u015fturmak veya yok etmek i\u00e7in harika bir ara\u00e7t\u0131r. Ancak, uygulaman\u0131n farkl\u0131 \"sayfalar\u0131\" veya \"ekranlar\u0131\" aras\u0131nda gezinme mant\u0131\u011f\u0131n\u0131 y\u00f6netmek i\u00e7in a\u015f\u0131r\u0131ya ka\u00e7t\u0131\u011f\u0131n\u0131zda problem yarat\u0131r. Yani, uygulaman\u0131z\u0131n b\u00fcy\u00fck b\u00f6l\u00fcmlerini veya \"ana g\u00f6r\u00fcn\u00fcmlerini\" gizlemek ve g\u00f6stermek i\u00e7in <code>*ngIf<\/code> kullan\u0131yorsan\u0131z, performans sorunlar\u0131 (bile\u015fenlerin s\u00fcrekli yeniden olu\u015fturulmas\u0131), durum kayb\u0131 ve URL ile taray\u0131c\u0131 ge\u00e7mi\u015fi entegrasyonu eksikli\u011fi gibi sorunlarla kar\u015f\u0131la\u015f\u0131rs\u0131n\u0131z. Bu t\u00fcr durumlarda Angular Router kullanmak daha uygun ve performansl\u0131d\u0131r.<\/p>\n<p><strong>2. Lazy Loading'in Angular uygulamalar\u0131 i\u00e7in en b\u00fcy\u00fck faydas\u0131 nedir?<\/strong><br \/>\nLazy loading'in en b\u00fcy\u00fck faydas\u0131, uygulaman\u0131n ilk y\u00fckleme s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131saltmas\u0131d\u0131r. T\u00fcm uygulama kodunu ba\u015flang\u0131\u00e7ta indirmek yerine, lazy loading ile sadece o an ihtiya\u00e7 duyulan mod\u00fcller y\u00fcklenir. Di\u011fer mod\u00fcller, kullan\u0131c\u0131 ilgili rotalara gitti\u011finde dinamik olarak indirilir. Bu, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar i\u00e7in kritik bir performans iyile\u015ftirmesidir ve daha h\u0131zl\u0131 bir ba\u015flang\u0131\u00e7 deneyimi sunar.<\/p>\n<p><strong>3. Route Guards g\u00fcvenli\u011fi nas\u0131l sa\u011flar?<\/strong><br \/>\nRoute Guards, belirli bir rotaya eri\u015fimi ko\u015fullu hale getirerek g\u00fcvenli\u011fi sa\u011flar. \u00d6rne\u011fin, bir <code>AuthGuard<\/code> kullanarak kullan\u0131c\u0131n\u0131n oturum a\u00e7m\u0131\u015f olup olmad\u0131\u011f\u0131n\u0131 kontrol edebilir ve oturum a\u00e7mam\u0131\u015fsa rotaya eri\u015fimi engelleyip bir giri\u015f sayfas\u0131na y\u00f6nlendirebilirsiniz. Ayr\u0131ca, kullan\u0131c\u0131n\u0131n belirli bir role (\u00f6rne\u011fin \"admin\") sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol ederek yetkilendirme yapabilir ve hassas b\u00f6l\u00fcmlere sadece yetkili kullan\u0131c\u0131lar\u0131n eri\u015fmesini sa\u011flayabilirsiniz.<\/p>\n<p><strong>4. Dinamik URL'ler i\u00e7in rota parametreleri nas\u0131l kullan\u0131l\u0131r?<\/strong><br \/>\nDinamik URL'ler i\u00e7in rota parametreleri, rota tan\u0131m\u0131nda <code>:<\/code> \u00f6nekiyle (<code>path: &#039;products\/:id&#039;<\/code>) tan\u0131mlan\u0131r. Bile\u015fen i\u00e7inde, <code>ActivatedRoute<\/code> servisi enjekte edilerek bu parametrelere eri\u015filir. <code>this.route.paramMap.subscribe(params => { const id = params.get(&#039;id&#039;); })<\/code> yap\u0131s\u0131 ile URL'den parametre de\u011ferleri al\u0131n\u0131r ve bile\u015fen i\u00e7inde ilgili veriyi \u00e7ekmek veya mant\u0131\u011f\u0131 uygulamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><strong>5. Angular Router'\u0131n SEO \u00fczerindeki etkisi nedir?<\/strong><br \/>\nAngular Router, <code>*ngIf<\/code> tabanl\u0131 manuel gezinmeye g\u00f6re SEO \u00fczerinde olumlu bir etkiye sahiptir. Her \"sayfan\u0131n\" benzersiz bir URL'ye sahip olmas\u0131, arama motoru botlar\u0131n\u0131n uygulaman\u0131zdaki farkl\u0131 i\u00e7erikleri daha kolay indekslemesini sa\u011flar. Ayr\u0131ca, Angular CLI ile sunucu taraf\u0131 renderlama (SSR) veya \u00f6nceden renderlama (prerendering) gibi teknikler uyguland\u0131\u011f\u0131nda, Router taraf\u0131ndan y\u00f6netilen i\u00e7erik daha etkin bir \u015fekilde arama motorlar\u0131 taraf\u0131ndan taranabilir ve indekslenebilir, bu da uygulaman\u0131z\u0131n arama motoru s\u0131ralamalar\u0131n\u0131 iyile\u015ftirir.<\/p>\n","protected":false},"excerpt":{"rendered":"Angular uygulamalar\u0131nda kullan\u0131c\u0131 aray\u00fcz\u00fc (UI) karma\u015fas\u0131yla m\u0131 kar\u015f\u0131la\u015f\u0131yorsunuz? Bu makale, Angular g\u00f6r\u00fcn\u00fcmlerinin temel sorunlar\u0131n\u0131 ve g\u00fc\u00e7l\u00fc rota y\u00f6netiminin&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-36168","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 UI Neden Da\u011f\u0131l\u0131r? Rota Y\u00f6netimi Nas\u0131l Kurtar\u0131r?<\/title>\n<meta name=\"description\" content=\"&copy; 2023 Blog Uygulamas\u0131\" \/>\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-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular UI Neden Da\u011f\u0131l\u0131r? Rota Y\u00f6netimi Nas\u0131l Kurtar\u0131r?\" \/>\n<meta property=\"og:description\" content=\"&copy; 2023 Blog Uygulamas\u0131\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-09T11:31:22+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=\"35 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Angular UI Neden Da\u011f\u0131l\u0131r? Rota Y\u00f6netimi Nas\u0131l Kurtar\u0131r?\",\"datePublished\":\"2025-12-09T11:31:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/\"},\"wordCount\":6087,\"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-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/\",\"name\":\"Angular UI Neden Da\u011f\u0131l\u0131r? Rota Y\u00f6netimi Nas\u0131l Kurtar\u0131r?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-09T11:31:22+00:00\",\"description\":\"&copy; 2023 Blog Uygulamas\u0131\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular UI Neden Da\u011f\u0131l\u0131r? Rota Y\u00f6netimi Nas\u0131l Kurtar\u0131r?\"}]},{\"@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 UI Neden Da\u011f\u0131l\u0131r? Rota Y\u00f6netimi Nas\u0131l Kurtar\u0131r?","description":"&copy; 2023 Blog Uygulamas\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\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/","og_locale":"tr_TR","og_type":"article","og_title":"Angular UI Neden Da\u011f\u0131l\u0131r? Rota Y\u00f6netimi Nas\u0131l Kurtar\u0131r?","og_description":"&copy; 2023 Blog Uygulamas\u0131","og_url":"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-09T11:31:22+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"35 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Angular UI Neden Da\u011f\u0131l\u0131r? Rota Y\u00f6netimi Nas\u0131l Kurtar\u0131r?","datePublished":"2025-12-09T11:31:22+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/"},"wordCount":6087,"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-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/","url":"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/","name":"Angular UI Neden Da\u011f\u0131l\u0131r? Rota Y\u00f6netimi Nas\u0131l Kurtar\u0131r?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-09T11:31:22+00:00","description":"&copy; 2023 Blog Uygulamas\u0131","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/angular-ui-neden-dagilir-rota-yonetimi-nasil-kurtarir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular UI Neden Da\u011f\u0131l\u0131r? Rota Y\u00f6netimi Nas\u0131l Kurtar\u0131r?"}]},{"@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\/36168","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=36168"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36168\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}