{"id":31189,"date":"2025-10-07T01:41:18","date_gmt":"2025-10-06T22:41:18","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31189"},"modified":"2025-10-07T01:41:18","modified_gmt":"2025-10-06T22:41:18","slug":"angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/","title":{"rendered":"Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi"},"content":{"rendered":"<p><body><\/p>\n<h2>Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi<\/h2>\n<h3>Giri\u015f: Haritalar\u0131n\u0131z\u0131 Etkile\u015fimli Hale Getirin<\/h3>\n<p>Angular ve Leaflet kullanarak etkile\u015fimli haritalar olu\u015fturma serimizin \u00fc\u00e7\u00fcnc\u00fc b\u00f6l\u00fcm\u00fcne ho\u015f geldiniz. \u00d6nceki b\u00f6l\u00fcmlerde, Angular uygulamalar\u0131m\u0131za temel bir Leaflet haritas\u0131n\u0131 nas\u0131l entegre edece\u011fimizi, harita katmanlar\u0131n\u0131 (tile layers) nas\u0131l y\u00f6netece\u011fimizi ve i\u015faret\u00e7ileri (markers) nas\u0131l ekleyece\u011fimizi \u00f6\u011frendik. Bu temel bilgilerin \u00fczerine in\u015fa ederek, bu b\u00f6l\u00fcmde haritalar\u0131m\u0131z\u0131 kullan\u0131c\u0131larla daha etkile\u015fimli hale getiren \u00f6nemli bir bile\u015fen olan &#8220;popup&#8221;lar\u0131 ele alaca\u011f\u0131z.<\/p>\n<p>Popuplar, harita \u00fczerindeki belirli bir noktaya veya \u00f6zelli\u011fe t\u0131kland\u0131\u011f\u0131nda ortaya \u00e7\u0131kan k\u00fc\u00e7\u00fck bilgi pencereleridir. Bir i\u015faret\u00e7inin, bir poligonun veya herhangi bir co\u011frafi \u00f6zelli\u011fin detaylar\u0131n\u0131, a\u00e7\u0131klamalar\u0131n\u0131 veya ilgili di\u011fer verileri g\u00f6stermek i\u00e7in kullan\u0131l\u0131rlar. Ancak, Leaflet&#8217;in varsay\u0131lan popuplar\u0131 genellikle basit metin veya statik HTML i\u00e7eri\u011fi kabul eder. Angular gibi modern bir \u00e7er\u00e7eveyle \u00e7al\u0131\u015f\u0131rken, bu popuplar\u0131n i\u00e7ine dinamik Angular bile\u015fenleri veya \u015fablonlar\u0131 yerle\u015ftirmek isteyebiliriz. Bu sayede, popuplar\u0131m\u0131z sadece bilgi g\u00f6stermekle kalmayacak, ayn\u0131 zamanda Angular&#8217;\u0131n t\u00fcm g\u00fcc\u00fcyle etkile\u015fimli formlar, d\u00fc\u011fmeler veya karma\u015f\u0131k veri g\u00f6rselle\u015ftirmeleri i\u00e7erebilecektir.<\/p>\n<p>\u0130\u015fte bu noktada &#8220;Popup Servisi&#8221; devreye giriyor. Bu makalede, Leaflet popuplar\u0131n\u0131 Angular bile\u015fenleriyle entegre etmek i\u00e7in g\u00fc\u00e7l\u00fc ve yeniden kullan\u0131labilir bir servis yap\u0131s\u0131 nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu servis, Angular bile\u015fenlerinin veya \u015fablonlar\u0131n\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc (olu\u015fturma, veri aktar\u0131m\u0131, yok etme) Leaflet popup&#8217;lar\u0131 i\u00e7inde y\u00f6netmemizi sa\u011flayacak, b\u00f6ylece temiz ve s\u00fcrd\u00fcr\u00fclebilir bir kod taban\u0131 elde edece\u011fiz.<\/p>\n<h3>Popup Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Popup&#8217;lar (a\u00e7\u0131l\u0131r pencereler), harita \u00fczerindeki belirli bir co\u011frafi \u00f6zelli\u011fe (bir i\u015faret\u00e7i, bir \u00e7izgi, bir alan vb.) ba\u011fl\u0131 olarak bilgi g\u00f6steren k\u00fc\u00e7\u00fck, ge\u00e7ici kullan\u0131c\u0131 aray\u00fcz\u00fc \u00f6\u011feleridir. Genellikle kullan\u0131c\u0131 bir harita \u00f6zelli\u011fine t\u0131klad\u0131\u011f\u0131nda veya \u00fczerine geldi\u011finde g\u00f6r\u00fcn\u00fcrler ve ilgili \u00f6zelli\u011fin detaylar\u0131n\u0131 sunarlar.<\/p>\n<p><strong>Neden \u00d6nemlidirler?<\/strong><\/p>\n<p>1.  <strong>Ba\u011flamsal Bilgi:<\/strong> Kullan\u0131c\u0131ya, bakt\u0131\u011f\u0131 belirli bir nokta veya alan hakk\u0131nda an\u0131nda, ba\u011flamsal bilgi sa\u011flarlar. \u00d6rne\u011fin, bir \u015fehir i\u015faret\u00e7isine t\u0131kland\u0131\u011f\u0131nda \u015fehrin n\u00fcfusunu, \u00f6nemli yerlerini veya k\u0131sa bir tarihini g\u00f6sterebilir.<br \/>\n2.  <strong>Etkile\u015fim:<\/strong> Popuplar sadece bilgi g\u00f6stermekle kalmaz, ayn\u0131 zamanda etkile\u015fimli \u00f6\u011feler (d\u00fc\u011fmeler, ba\u011flant\u0131lar, formlar) i\u00e7erebilir. Bu sayede kullan\u0131c\u0131lar popup \u00fczerinden do\u011frudan eylemler ger\u00e7ekle\u015ftirebilirler.<br \/>\n3.  <strong>Kullan\u0131c\u0131 Deneyimi:<\/strong> Harita \u00fczerinde \u00e7ok fazla bilgi g\u00f6stermek yerine, bilgiyi ihtiya\u00e7 duyuldu\u011funda sunarak haritan\u0131n daha temiz ve anla\u015f\u0131l\u0131r kalmas\u0131n\u0131 sa\u011flarlar. Bu, daha iyi bir kullan\u0131c\u0131 deneyimi sunar.<br \/>\n4.  <strong>Veri Zenginle\u015ftirme:<\/strong> Harita \u00fczerindeki basit bir i\u015faret\u00e7inin ard\u0131nda yatan zengin verileri kullan\u0131c\u0131ya sunman\u0131n etkili bir yoludur.<\/p>\n<p><strong>Yayg\u0131n Kullan\u0131m Alanlar\u0131:<\/strong><\/p>\n<p>*   <strong>\u0130\u015faret\u00e7i Detaylar\u0131:<\/strong> Bir restoran\u0131n, ma\u011fazan\u0131n veya tarihi bir yerin ad\u0131n\u0131, adresini, \u00e7al\u0131\u015fma saatlerini ve derecelendirmesini g\u00f6sterme.<br \/>\n*   <strong>Co\u011frafi B\u00f6lge Bilgisi:<\/strong> Bir \u00fclkeye veya eyalete t\u0131kland\u0131\u011f\u0131nda n\u00fcfusu, ba\u015fkenti veya ekonomik verileri g\u00f6sterme.<br \/>\n*   <strong>Rota Bilgisi:<\/strong> Bir rotan\u0131n belirli bir noktas\u0131 hakk\u0131nda tahmini var\u0131\u015f s\u00fcresi veya trafik durumu gibi bilgiler sunma.<br \/>\n*   <strong>Sens\u00f6r Verileri:<\/strong> Hava durumu istasyonlar\u0131 veya IoT cihazlar\u0131ndan gelen anl\u0131k verileri g\u00f6rselle\u015ftirme.<\/p>\n<h3>Leaflet&#8217;te Temel Popup Kullan\u0131m\u0131<\/h3>\n<p>Leaflet, popuplar\u0131 y\u00f6netmek i\u00e7in basit ve etkili bir API sunar. Temel olarak, bir popup&#8217;\u0131 bir i\u015faret\u00e7iye veya ba\u015fka bir katmana ba\u011flayabilir ve i\u00e7ine metin veya HTML i\u00e7eri\u011fi yerle\u015ftirebilirsiniz.<\/p>\n<h4>\u0130\u015faret\u00e7iye Popup Ba\u011flama<\/h4>\n<p>En yayg\u0131n kullan\u0131m senaryosu, bir i\u015faret\u00e7iye popup ba\u011flamakt\u0131r.<\/p>\n<pre><code class=\"language-typescript\">import * as L from 'leaflet';\n\n\/\/ Harita olu\u015fturma (\u00f6nceki b\u00f6l\u00fcmlerden)\nconst map = L.map('map').setView([39.9334, 32.8597], 10);\nL.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png').addTo(map);\n\n\/\/ Bir i\u015faret\u00e7i olu\u015fturma\nconst marker = L.marker([39.9334, 32.8597]).addTo(map);\n\n\/\/ \u0130\u015faret\u00e7iye basit bir popup ba\u011flama\nmarker.bindPopup(\"<b>Merhaba!<\/b><br><i>Bu bir Leaflet popup'\u0131d\u0131r.<\/i>\").openPopup();\n\/\/ openPopup() \u00e7a\u011fr\u0131s\u0131, harita y\u00fcklendi\u011finde popup'\u0131n otomatik olarak a\u00e7\u0131lmas\u0131n\u0131 sa\u011flar.\n\/\/ Genellikle bu, kullan\u0131c\u0131n\u0131n i\u015faret\u00e7iye t\u0131klamas\u0131yla tetiklenir, bu durumda openPopup() \u00e7a\u011fr\u0131s\u0131na gerek kalmaz.<\/code><\/pre>\n<p><code>bindPopup()<\/code> metodu, bir popup&#8217;\u0131 bir katmana (marker, circle, polygon vb.) ba\u011flar. Kullan\u0131c\u0131 katmana t\u0131klad\u0131\u011f\u0131nda popup otomatik olarak a\u00e7\u0131l\u0131r. <code>openPopup()<\/code> metodu ise popup&#8217;\u0131 programatik olarak a\u00e7ar.<\/p>\n<h4>Popup Se\u00e7enekleri<\/h4>\n<p><code>bindPopup()<\/code> ve <code>L.popup()<\/code> metodlar\u0131, popup&#8217;\u0131n davran\u0131\u015f\u0131n\u0131 ve g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc \u00f6zelle\u015ftirmek i\u00e7in bir dizi se\u00e7enek al\u0131r:<\/p>\n<pre><code class=\"language-typescript\">const customPopup = L.popup({\n  maxWidth: 300,        \/\/ Popup'\u0131n maksimum geni\u015fli\u011fi\n  minWidth: 100,        \/\/ Popup'\u0131n minimum geni\u015fli\u011fi\n  autoClose: true,      \/\/ Haritan\u0131n ba\u015fka bir yerine t\u0131kland\u0131\u011f\u0131nda popup'\u0131n otomatik kapanmas\u0131\n  closeButton: true,    \/\/ Popup'ta bir kapatma d\u00fc\u011fmesi g\u00f6sterilmesi\n  closeOnClick: true,   \/\/ Haritan\u0131n ba\u015fka bir yerine t\u0131kland\u0131\u011f\u0131nda popup'\u0131n kapanmas\u0131 (autoClose ile benzer)\n  className: 'my-custom-popup' \/\/ Popup'a \u00f6zel bir CSS s\u0131n\u0131f\u0131 ekleme\n})\n.setLatLng([39.95, 32.90]) \/\/ Popup'\u0131n a\u00e7\u0131laca\u011f\u0131 koordinatlar\n.setContent(\"<b>\u00d6zel Popup<\/b><br><i>\u00c7e\u015fitli se\u00e7eneklerle.<\/i>\");\n\n\/\/ Popup'\u0131 haritaya ekleme (bir i\u015faret\u00e7iye ba\u011fl\u0131 de\u011filse)\n\/\/ customPopup.openOn(map); \/\/ Bu, popup'\u0131 do\u011frudan harita \u00fczerinde a\u00e7ar.\n\n\/\/ Bir i\u015faret\u00e7iye ba\u011flamak i\u00e7in:\nconst markerWithOptions = L.marker([39.95, 32.90]).addTo(map);\nmarkerWithOptions.bindPopup(customPopup); \/\/ \u00d6nceden olu\u015fturulmu\u015f bir popup nesnesini ba\u011flama<\/code><\/pre>\n<p><code>setLatLng()<\/code> ve <code>setContent()<\/code> metodlar\u0131, bir popup nesnesi olu\u015fturulduktan sonra i\u00e7eri\u011fini ve konumunu dinamik olarak ayarlamak i\u00e7in kullan\u0131l\u0131r. <code>openOn(map)<\/code> ise popup&#8217;\u0131 do\u011frudan harita \u00fczerinde a\u00e7ar ve kapatma olaylar\u0131n\u0131 harita ile ili\u015fkilendirir.<\/p>\n<h4>Di\u011fer Katmanlarda Popup Kullan\u0131m\u0131<\/h4>\n<p>Popuplar sadece i\u015faret\u00e7ilerle s\u0131n\u0131rl\u0131 de\u011fildir. Poligonlar, \u00e7oklu \u00e7izgiler (polylines) ve daireler (circles) gibi di\u011fer Leaflet katmanlar\u0131na da ba\u011flanabilirler.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bir daireye popup ba\u011flama\nconst circle = L.circle([39.92, 32.80], {\n  color: 'red',\n  fillColor: '#f03',\n  fillOpacity: 0.5,\n  radius: 500\n}).addTo(map);\n\ncircle.bindPopup(\"Bu bir daire! Yar\u0131\u00e7ap\u0131 500 metre.\");\n\n\/\/ Bir poligona popup ba\u011flama\nconst polygon = L.polygon([\n  [39.94, 32.82],\n  [39.96, 32.85],\n  [39.94, 32.88]\n], {\n  color: 'blue',\n  fillColor: '#00f',\n  fillOpacity: 0.3\n}).addTo(map);\n\npolygon.bindPopup(\"Bu bir poligon! Ankara'n\u0131n bir b\u00f6lgesi.\");<\/code><\/pre>\n<p><strong>GeoJSON Katmanlar\u0131 ve Popuplar:<\/strong><\/p>\n<p>GeoJSON katmanlar\u0131 genellikle birden fazla \u00f6zelli\u011fi i\u00e7erir. Her bir \u00f6zelli\u011fe ayr\u0131 ayr\u0131 popup ba\u011flamak yerine, <code>onEachFeature<\/code> se\u00e7ene\u011fini kullanarak her bir GeoJSON \u00f6zelli\u011fine dinamik olarak popup ba\u011flayabiliriz:<\/p>\n<pre><code class=\"language-typescript\">const geojsonFeature = {\n  \"type\": \"Feature\",\n  \"properties\": {\n    \"name\": \"Ku\u011fulu Park\",\n    \"amenity\": \"Park\",\n    \"popupContent\": \"Ankara'n\u0131n simgelerinden Ku\u011fulu Park.\"\n  },\n  \"geometry\": {\n    \"type\": \"Point\",\n    \"coordinates\": [32.8656, 39.9079] \/\/ Leaflet'te LatLng bekler, GeoJSON'da LngLat\n  }\n};\n\nL.geoJSON(geojsonFeature, {\n  onEachFeature: function (feature, layer) {\n    if (feature.properties && feature.properties.popupContent) {\n      layer.bindPopup(feature.properties.popupContent);\n    }\n  }\n}).addTo(map);<\/code><\/pre>\n<p>Bu temel kullan\u0131mlar, Leaflet&#8217;in popuplarla ne kadar esnek oldu\u011funu g\u00f6sterir. Ancak, Angular bile\u015fenlerinin dinamik g\u00fcc\u00fcn\u00fc bu popuplara ta\u015f\u0131mak i\u00e7in daha geli\u015fmi\u015f bir yakla\u015f\u0131ma ihtiyac\u0131m\u0131z var.<\/p>\n<h3>Angular Entegrasyon Zorluklar\u0131 ve Neden Bir Servis \u0130htiyac\u0131<\/h3>\n<p>Leaflet&#8217;in <code>bindPopup()<\/code> veya <code>setContent()<\/code> metodlar\u0131, genellikle d\u00fcz metin (string) veya ham HTML (string) bekler. Angular uygulamas\u0131nda, kullan\u0131c\u0131 aray\u00fcz\u00fcm\u00fcz\u00fc bile\u015fenler (components) ve \u015fablonlar (templates) arac\u0131l\u0131\u011f\u0131yla olu\u015ftururuz. Bu bile\u015fenler, kendi ya\u015fam d\u00f6ng\u00fcleri, veri ba\u011flama mekanizmalar\u0131, olay dinleyicileri ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu gibi Angular \u00f6zelliklerine sahiptir.<\/p>\n<p>Leaflet popup&#8217;\u0131na do\u011frudan bir Angular bile\u015feninin HTML&#8217;ini string olarak vermek, bile\u015fenin Angular taraf\u0131ndan y\u00f6netilen ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc, veri ba\u011flamas\u0131n\u0131 veya olay dinleyicilerini kaybetmesine neden olur. Yani, popup&#8217;\u0131n i\u00e7indeki bir d\u00fc\u011fmeye t\u0131klamak veya bir input alan\u0131na veri girmek gibi Angular&#8217;\u0131n y\u00f6netti\u011fi etkile\u015fimler \u00e7al\u0131\u015fmayacakt\u0131r.<\/p>\n<p><strong>Kar\u015f\u0131la\u015f\u0131lan Zorluklar:<\/strong><\/p>\n<p>1.  <strong>Angular Ya\u015fam D\u00f6ng\u00fcs\u00fc Y\u00f6netimi:<\/strong> Bir Angular bile\u015feni, <code>ngOnInit<\/code>, <code>ngOnDestroy<\/code> gibi ya\u015fam d\u00f6ng\u00fcs\u00fc hook&#8217;lar\u0131na sahiptir. Leaflet popup&#8217;\u0131na yerle\u015ftirilen bir bile\u015fenin bu hook&#8217;lar\u0131 do\u011fru \u015fekilde tetiklenmezse, bellek s\u0131z\u0131nt\u0131lar\u0131 veya beklenmedik davran\u0131\u015flar ortaya \u00e7\u0131kabilir.<br \/>\n2.  <strong>Veri Ba\u011flama ve Olay Y\u00f6netimi:<\/strong> <code>[(ngModel)]<\/code>, <code>(click)<\/code>, <code>@Input<\/code>, <code>@Output<\/code> gibi Angular&#8217;\u0131n temel \u00f6zellikleri, bile\u015fen Leaflet taraf\u0131ndan y\u00f6netildi\u011finde \u00e7al\u0131\u015fmaz.<br \/>\n3.  <strong>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu:<\/strong> Popup i\u00e7indeki bir bile\u015fenin ba\u015fka servisleri kullanmas\u0131 gerekti\u011finde, Angular&#8217;\u0131n ba\u011f\u0131ml\u0131l\u0131k enjeksiyon mekanizmas\u0131 do\u011fal olarak devreye giremez.<br \/>\n4.  <strong>Yeniden Kullan\u0131labilirlik:<\/strong> Her popup i\u00e7in manuel olarak DOM manip\u00fclasyonu yapmak veya bile\u015fenleri el ile olu\u015fturmak, kod tekrar\u0131na ve bak\u0131m zorlu\u011funa yol a\u00e7ar.<\/p>\n<p>Bu sorunlar\u0131 \u00e7\u00f6zmek ve Angular&#8217;\u0131n t\u00fcm g\u00fcc\u00fcn\u00fc Leaflet popuplar\u0131na ta\u015f\u0131mak i\u00e7in bir &#8220;Popup Servisi&#8221;ne ihtiyac\u0131m\u0131z var. Bu servis, Angular bile\u015fenlerini veya \u015fablonlar\u0131n\u0131 dinamik olarak olu\u015fturacak, onlar\u0131 Leaflet popup&#8217;\u0131n\u0131n i\u00e7ine yerle\u015ftirecek ve popup kapand\u0131\u011f\u0131nda bile\u015fenin do\u011fru \u015fekilde temizlenmesini sa\u011flayacakt\u0131r.<\/p>\n<p><strong>Servisin Temel G\u00f6revleri:<\/strong><\/p>\n<p>*   <strong>Dinamik Bile\u015fen Olu\u015fturma:<\/strong> Verilen bir Angular bile\u015fen tipinden (\u00f6rne\u011fin <code>MarkerPopupComponent<\/code>) dinamik olarak bir \u00f6rnek olu\u015fturmak.<br \/>\n*   <strong>DOM Ekleme:<\/strong> Olu\u015fturulan bile\u015fenin DOM elementini Leaflet popup&#8217;\u0131n\u0131n i\u00e7eri\u011fi olarak sa\u011flamak.<br \/>\n*   <strong>Veri Aktar\u0131m\u0131:<\/strong> Popup bile\u015fenine d\u0131\u015far\u0131dan veri (<code>@Input<\/code> ile) aktarmak.<br \/>\n*   <strong>Ya\u015fam D\u00f6ng\u00fcs\u00fc Y\u00f6netimi:<\/strong> Bile\u015feni Angular uygulama ba\u011flam\u0131na ekleyerek ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc ba\u015flatmak ve popup kapand\u0131\u011f\u0131nda bile\u015feni do\u011fru \u015fekilde yok etmek.<br \/>\n*   <strong>\u015eablon Entegrasyonu:<\/strong> Sadece bile\u015fenler de\u011fil, ayn\u0131 zamanda <code>ng-template<\/code> ile tan\u0131mlanm\u0131\u015f Angular \u015fablonlar\u0131n\u0131 da popuplara yerle\u015ftirebilmek.<\/p>\n<p>Bu servisi olu\u015fturarak, harita bile\u015fenimiz i\u00e7inde temiz ve Angular&#8217;a \u00f6zg\u00fc bir \u015fekilde popuplar\u0131m\u0131z\u0131 y\u00f6netebilece\u011fiz.<\/p>\n<h3>Popup Servisini Tasarlamak<\/h3>\n<p>Angular&#8217;da dinamik olarak bile\u015fen olu\u015fturmak ve bunlar\u0131 DOM&#8217;a eklemek i\u00e7in baz\u0131 Angular \u00e7ekirdek API&#8217;lerini kullanmam\u0131z gerekir. Bu API&#8217;ler genellikle bir servis i\u00e7inde sarmalanarak yeniden kullan\u0131labilir hale getirilir.<\/p>\n<p><strong>Kullan\u0131lacak Angular API&#8217;leri:<\/strong><\/p>\n<p>1.  <strong><code>ComponentFactoryResolver<\/code>:<\/strong> Bir Angular bile\u015feninin <code>Type<\/code>&#8216;\u0131ndan (\u00f6rne\u011fin <code>MarkerPopupComponent<\/code>) bir <code>ComponentFactory<\/code> olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. Bu fabrika, daha sonra bile\u015fenin \u00f6rneklerini olu\u015fturabilir.<br \/>\n2.  <strong><code>ApplicationRef<\/code>:<\/strong> Bir Angular uygulamas\u0131n\u0131n ana \u00f6rne\u011fidir. Dinamik olarak olu\u015fturulan bile\u015fenlerin host view&#8217;lerini Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama (change detection) d\u00f6ng\u00fcs\u00fcne ve ya\u015fam d\u00f6ng\u00fcs\u00fc y\u00f6netimine dahil etmek i\u00e7in kullan\u0131l\u0131r. <code>attachView()<\/code> ve <code>detachView()<\/code> metodlar\u0131 bu ama\u00e7la kullan\u0131l\u0131r.<br \/>\n3.  <strong><code>Injector<\/code>:<\/strong> Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu i\u00e7in kullan\u0131l\u0131r. Dinamik olarak olu\u015fturulan bile\u015fenlerin kendi ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 \u00e7\u00f6zebilmesi i\u00e7in bir injector sa\u011flamak \u00f6nemlidir.<br \/>\n4.  <strong><code>EmbeddedViewRef<\/code> \/ <code>TemplateRef<\/code>:<\/strong> E\u011fer bir bile\u015fen yerine bir <code>ng-template<\/code> i\u00e7eri\u011fini popup&#8217;a yerle\u015ftirmek istersek, <code>TemplateRef<\/code>&#8216;i kullanarak bir <code>EmbeddedViewRef<\/code> olu\u015fturabiliriz.<\/p>\n<p><strong>Servis Yap\u0131s\u0131:<\/strong><\/p>\n<p><code>MapPopupService<\/code> ad\u0131nda bir servis olu\u015fturaca\u011f\u0131z. Bu servis, iki ana metot i\u00e7erecek:<\/p>\n<p>*   <code>openComponentPopup()<\/code>: Bir Angular bile\u015fenini Leaflet popup&#8217;\u0131 olarak a\u00e7mak i\u00e7in.<br \/>\n*   <code>openTemplatePopup()<\/code>: Bir Angular \u015fablonunu (<code>ng-template<\/code>) Leaflet popup&#8217;\u0131 olarak a\u00e7mak i\u00e7in.<\/p>\n<p>Her iki metot da \u015fu parametreleri alacakt\u0131r:<br \/>\n*   <code>map: L.Map<\/code>: Popup&#8217;\u0131n hangi harita \u00fczerinde a\u00e7\u0131laca\u011f\u0131n\u0131 belirten Leaflet harita nesnesi.<br \/>\n*   <code>latlng: L.LatLngExpression<\/code>: Popup&#8217;\u0131n a\u00e7\u0131laca\u011f\u0131 co\u011frafi koordinatlar.<br \/>\n*   <code>componentType: Type<any><\/code> veya <code>templateRef: TemplateRef<any><\/code>: Popup&#8217;\u0131n i\u00e7eri\u011fi olacak Angular bile\u015feni veya \u015fablonu.<br \/>\n*   <code>data?: any<\/code> veya <code>context?: any<\/code>: Popup bile\u015fenine (<code>@Input<\/code> ile) veya \u015fablonuna (<code>let-<\/code> s\u00f6zdizimi ile) aktar\u0131lacak veriler.<br \/>\n*   <code>options?: L.PopupOptions<\/code>: Leaflet popup&#8217;\u0131n\u0131n \u00f6zelle\u015ftirme se\u00e7enekleri (maxWidth, className vb.).<\/p>\n<p>Servis ayr\u0131ca, popup kapand\u0131\u011f\u0131nda dinamik olarak olu\u015fturulan Angular bile\u015fenlerinin veya \u015fablon g\u00f6r\u00fcn\u00fcmlerinin Angular&#8217;\u0131n <code>ApplicationRef<\/code>&#8216;inden ayr\u0131lmas\u0131n\u0131 ve yok edilmesini sa\u011flayarak bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nleyecektir. Bu, <code>L.popup<\/code> nesnesinin <code>remove<\/code> olay\u0131n\u0131 dinleyerek ger\u00e7ekle\u015ftirilecektir.<\/p>\n<p>\u015eimdi bu tasar\u0131m\u0131 ad\u0131m ad\u0131m kodlayarak hayata ge\u00e7irelim.<\/p>\n<h3>Ad\u0131m Ad\u0131m Uygulama<\/h3>\n<p>Bu b\u00f6l\u00fcmde, Popup Servisimizi olu\u015fturaca\u011f\u0131z, bir \u00f6rnek popup bile\u015feni tan\u0131mlayaca\u011f\u0131z ve ard\u0131ndan bu servisi harita bile\u015fenimizde nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 g\u00f6sterece\u011fiz.<\/p>\n<h4>1. Popup Servisini Olu\u015fturma (<code>map-popup.service.ts<\/code>)<\/h4>\n<pre><code class=\"language-typescript\">\/\/ src\/app\/services\/map-popup.service.ts\nimport {\n  Injectable,\n  ComponentFactoryResolver,\n  ApplicationRef,\n  Injector,\n  Type,\n  EmbeddedViewRef,\n  TemplateRef,\n  ComponentRef\n} from '@angular\/core';\nimport * as L from 'leaflet';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class MapPopupService {\n  constructor(\n    private componentFactoryResolver: ComponentFactoryResolver,\n    private appRef: ApplicationRef,\n    private injector: Injector\n  ) {}\n\n  \/<em><\/em>\n   * Bir Angular bile\u015fenini Leaflet popup'\u0131 olarak a\u00e7ar.\n   * @param map Popup'\u0131n a\u00e7\u0131laca\u011f\u0131 Leaflet harita nesnesi.\n   * @param latlng Popup'\u0131n a\u00e7\u0131laca\u011f\u0131 koordinatlar.\n   * @param componentType Popup i\u00e7eri\u011fi olacak Angular bile\u015feninin tipi.\n   * @param data Bile\u015fene aktar\u0131lacak @Input verileri.\n   * @param options Leaflet popup se\u00e7enekleri.\n   * @returns A\u00e7\u0131lan Leaflet Popup nesnesi.\n   *\/\n  openComponentPopup(\n    map: L.Map,\n    latlng: L.LatLngExpression,\n    componentType: Type<any>,\n    data?: any,\n    options?: L.PopupOptions\n  ): L.Popup {\n    \/\/ 1. Bile\u015fen Fabrikas\u0131 Olu\u015fturma\n    const componentFactory = this.componentFactoryResolver.resolveComponentFactory(componentType);\n\n    \/\/ 2. Bile\u015fen \u00d6rne\u011fi Olu\u015fturma\n    \/\/ Injector'\u0131 kullanarak bile\u015fenin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 \u00e7\u00f6zmesini sa\u011fl\u0131yoruz.\n    const componentRef: ComponentRef<any> = componentFactory.create(this.injector);\n\n    \/\/ 3. Bile\u015fene veri aktar\u0131m\u0131 (@Input)\n    if (data) {\n      Object.assign(componentRef.instance, data);\n      \/\/ De\u011fi\u015fiklik alg\u0131lamay\u0131 manuel olarak tetikleme\n      componentRef.changeDetectorRef.detectChanges();\n    }\n\n    \/\/ 4. Bile\u015fenin g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc Angular uygulama a\u011fac\u0131na ekleme\n    \/\/ Bu, bile\u015fenin ya\u015fam d\u00f6ng\u00fcs\u00fc hook'lar\u0131n\u0131n (ngOnInit vb.) tetiklenmesini ve\n    \/\/ de\u011fi\u015fiklik alg\u0131laman\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.\n    this.appRef.attachView(componentRef.hostView);\n\n    \/\/ 5. Bile\u015fenin DOM elementini alma\n    \/\/ Host view'den rootNodes'u alarak bile\u015fenin ana DOM elementine eri\u015fiyoruz.\n    const popupContent = (componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\n\n    \/\/ 6. Leaflet Popup olu\u015fturma ve i\u00e7eri\u011fi ayarlama\n    const popup = L.popup(options)\n      .setLatLng(latlng)\n      .setContent(popupContent)\n      .openOn(map);\n\n    \/\/ 7. Popup kapand\u0131\u011f\u0131nda bile\u015feni temizleme\n    \/\/ Popup'\u0131n 'remove' olay\u0131n\u0131 dinleyerek, Angular bile\u015feninin\n    \/\/ uygulama a\u011fac\u0131ndan ayr\u0131lmas\u0131n\u0131 ve yok edilmesini sa\u011fl\u0131yoruz.\n    \/\/ Bu, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nler.\n    popup.on('remove', () => {\n      this.appRef.detachView(componentRef.hostView);\n      componentRef.destroy();\n    });\n\n    return popup;\n  }\n\n  \/<em><\/em>\n   * Bir Angular \u015fablonunu (ng-template) Leaflet popup'\u0131 olarak a\u00e7ar.\n   * @param map Popup'\u0131n a\u00e7\u0131laca\u011f\u0131 Leaflet harita nesnesi.\n   * @param latlng Popup'\u0131n a\u00e7\u0131laca\u011f\u0131 koordinatlar.\n   * @param templateRef Popup i\u00e7eri\u011fi olacak Angular \u015fablonunun referans\u0131.\n   * @param context \u015eablona aktar\u0131lacak ba\u011flam verileri (let- ile eri\u015filebilir).\n   * @param options Leaflet popup se\u00e7enekleri.\n   * @returns A\u00e7\u0131lan Leaflet Popup nesnesi.\n   *\/\n  openTemplatePopup(\n    map: L.Map,\n    latlng: L.LatLngExpression,\n    templateRef: TemplateRef<any>,\n    context?: any,\n    options?: L.PopupOptions\n  ): L.Popup {\n    \/\/ 1. \u015eablon g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc olu\u015fturma\n    \/\/ Context, \u015fablondaki \"let-\" de\u011fi\u015fkenlerine aktar\u0131lacak veridir.\n    const viewRef: EmbeddedViewRef<any> = templateRef.createEmbeddedView(context);\n\n    \/\/ 2. G\u00f6r\u00fcn\u00fcm\u00fc Angular uygulama a\u011fac\u0131na ekleme\n    this.appRef.attachView(viewRef);\n\n    \/\/ 3. \u015eablonun DOM elementini alma\n    const popupContent = (viewRef.rootNodes[0] as HTMLElement);\n\n    \/\/ 4. Leaflet Popup olu\u015fturma ve i\u00e7eri\u011fi ayarlama\n    const popup = L.popup(options)\n      .setLatLng(latlng)\n      .setContent(popupContent)\n      .openOn(map);\n\n    \/\/ 5. Popup kapand\u0131\u011f\u0131nda g\u00f6r\u00fcn\u00fcm\u00fc temizleme\n    popup.on('remove', () => {\n      this.appRef.detachView(viewRef);\n      viewRef.destroy();\n    });\n\n    return popup;\n  }\n}<\/code><\/pre>\n<p><strong>\u00d6nemli Not:<\/strong> Angular 9 ve \u00fczeri versiyonlarda, Ivy derleyicisi sayesinde <code>entryComponents<\/code> dizisine bile\u015fenleri eklemeye genellikle gerek kalmaz. Ancak eski versiyonlar veya baz\u0131 \u00f6zel durumlarda, dinamik olarak olu\u015fturulan bile\u015fenlerin (bu \u00f6rnekte <code>MarkerPopupComponent<\/code>) Angular mod\u00fcl\u00fcn\u00fcn <code>@NgModule<\/code> dekorat\u00f6r\u00fcndeki <code>entryComponents<\/code> dizisine eklenmesi gerekebilir.<\/p>\n<h4>2. \u00d6rnek Bir Popup Bile\u015feni Olu\u015fturma (<code>marker-popup.component.ts<\/code>)<\/h4>\n<p>\u015eimdi, popup servisi arac\u0131l\u0131\u011f\u0131yla Leaflet popup&#8217;\u0131n\u0131n i\u00e7inde g\u00f6r\u00fcnt\u00fclenecek basit bir Angular bile\u015feni olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-typescript\">\/\/ src\/app\/components\/marker-popup\/marker-popup.component.ts\nimport { Component, Input, Output, EventEmitter } from '@angular\/core';\n\n@Component({\n  selector: 'app-marker-popup',\n  template: <code>\n    <div class=\"custom-popup\">\n      <h3>{{ title }}<\/h3>\n      <p>{{ description }}<\/p>\n      <button (click)=\"onDetailsClick()\">Detaylar\u0131 G\u00f6r<\/button>\n      <p *ngIf=\"additionalInfo\">{{ additionalInfo }}<\/p>\n    <\/div>\n  <\/code>,\n  styles: [<code>\n    .custom-popup {\n      padding: 10px;\n      font-family: Arial, sans-serif;\n    }\n    h3 {\n      color: #3f51b5; \/<em> Angular Material primary color example <\/em>\/\n      margin-top: 0;\n      margin-bottom: 8px;\n    }\n    p {\n      color: #555;\n      font-size: 14px;\n      margin-bottom: 12px;\n    }\n    button {\n      background-color: #f44336; \/<em> Angular Material warn color example <\/em>\/\n      color: white;\n      border: none;\n      padding: 8px 12px;\n      border-radius: 4px;\n      cursor: pointer;\n      font-size: 14px;\n      transition: background-color 0.3s ease;\n    }\n    button:hover {\n      background-color: #d32f2f;\n    }\n  <\/code>]\n})\nexport class MarkerPopupComponent {\n  @Input() title: string = 'Varsay\u0131lan Ba\u015fl\u0131k';\n  @Input() description: string = 'Varsay\u0131lan A\u00e7\u0131klama.';\n  @Input() additionalInfo: string | null = null; \/\/ Opsiyonel ek bilgi\n\n  @Output() detailsClicked = new EventEmitter<string>(); \/\/ Olay yaymak i\u00e7in\n\n  constructor() {\n    console.log('MarkerPopupComponent constructor called');\n  }\n\n  ngOnInit() {\n    console.log('MarkerPopupComponent ngOnInit called', this.title);\n  }\n\n  ngOnDestroy() {\n    console.log('MarkerPopupComponent ngOnDestroy called', this.title);\n  }\n\n  onDetailsClick(): void {\n    alert(<code>Detaylar i\u00e7in t\u0131kland\u0131: ${this.title}<\/code>);\n    this.detailsClicked.emit(this.title); \/\/ Bir olay yayma \u00f6rne\u011fi\n  }\n}<\/code><\/pre>\n<p>Bu bile\u015fen, <code>@Input<\/code> dekorat\u00f6rleri ile d\u0131\u015far\u0131dan <code>title<\/code>, <code>description<\/code> ve <code>additionalInfo<\/code> alabilir. Ayr\u0131ca, <code>onDetailsClick()<\/code> metodu ile bir d\u00fc\u011fme t\u0131klamas\u0131n\u0131 i\u015fleyebilir ve hatta bir <code>@Output<\/code> EventEmitter kullanarak \u00fcst bile\u015fene olay yayabilir. <code>ngOnInit<\/code> ve <code>ngOnDestroy<\/code> hook&#8217;lar\u0131, servisimizin ya\u015fam d\u00f6ng\u00fcs\u00fc y\u00f6netimini do\u011fru yapt\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in konsola mesaj yazacakt\u0131r.<\/p>\n<h4>3. Mod\u00fcl Yap\u0131land\u0131rmas\u0131 (<code>app.module.ts<\/code>)<\/h4>\n<p><code>MarkerPopupComponent<\/code>&#8216;in uygulaman\u0131z taraf\u0131ndan tan\u0131nmas\u0131 i\u00e7in <code>app.module.ts<\/code> i\u00e7inde <code>declarations<\/code> dizisine eklenmesi gerekir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ src\/app\/app.module.ts\nimport { NgModule } from '@angular\/core';\nimport { BrowserModule } from '@angular\/platform-browser';\n\nimport { AppComponent } from '.\/app.component';\nimport { MapComponent } from '.\/components\/map\/map.component'; \/\/ Harita bile\u015feniniz\nimport { MarkerPopupComponent } from '.\/components\/marker-popup\/marker-popup.component'; \/\/ Yeni popup bile\u015feniniz\n\n@NgModule({\n  declarations: [\n    AppComponent,\n    MapComponent,\n    MarkerPopupComponent \/\/ Popup bile\u015fenini burada tan\u0131ml\u0131yoruz\n  ],\n  imports: [\n    BrowserModule\n  ],\n  providers: [],\n  bootstrap: [AppComponent]\n})\nexport class AppModule { }<\/code><\/pre>\n<h4>4. Harita Bile\u015feninde Servisi Kullanma (<code>map.component.ts<\/code>)<\/h4>\n<p>\u015eimdi <code>MapComponent<\/code> i\u00e7inde <code>MapPopupService<\/code>&#8216;i enjekte edip hem bile\u015fen tabanl\u0131 hem de \u015fablon tabanl\u0131 popuplar\u0131 nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 g\u00f6sterelim.<\/p>\n<pre><code class=\"language-typescript\">\/\/ src\/app\/components\/map\/map.component.ts\nimport { Component, OnInit, AfterViewInit, ViewChild, ElementRef, TemplateRef } from '@angular\/core';\nimport * as L from 'leaflet';\nimport { MapPopupService } from '..\/..\/services\/map-popup.service'; \/\/ Popup servisimiz\nimport { MarkerPopupComponent } from '..\/marker-popup\/marker-popup.component'; \/\/ Popup bile\u015fenimiz\n\n@Component({\n  selector: 'app-map',\n  template: <code>\n    <div #mapContainer id=\"map\" style=\"height: 500px; width: 100%;\"><\/div>\n\n    <!-- ng-template ile tan\u0131mlanm\u0131\u015f \u015fablon popup i\u00e7eri\u011fi -->\n    <ng-template #templatePopupContent let-title=\"title\" let-description=\"description\">\n      <div style=\"padding: 10px; background-color: #e0f2f7; border-radius: 5px;\">\n        <h4 style=\"color: #007bff; margin-top: 0;\">Template Popup: {{ title }}<\/h4>\n        <p style=\"color: #333; font-size: 13px;\">{{ description }}<\/p>\n        <button (click)=\"alertFromTemplate(title)\"\n                style=\"background-color: #28a745; color: white; border: none; padding: 7px 10px; border-radius: 3px; cursor: pointer;\">\n          Daha Fazla Bilgi\n        <\/button>\n      <\/div>\n    <\/ng-template>\n  <\/code>,\n  styles: [<code>\n    \/<em> Leaflet popup'lar\u0131n\u0131n genel stilini \u00f6zelle\u015ftirebiliriz <\/em>\/\n    .leaflet-popup-content-wrapper {\n      border-radius: 8px;\n      box-shadow: 0 3px 10px rgba(0,0,0,0.2);\n    }\n    .leaflet-popup-tip {\n      background: #fff;\n    }\n    .custom-template-popup .leaflet-popup-content-wrapper {\n      background-color: #e0f2f7; \/<em> Template popup'\u0131na \u00f6zel arka plan <\/em>\/\n    }\n    .custom-template-popup .leaflet-popup-tip {\n      background: #e0f2f7;\n    }\n  <\/code>]\n})\nexport class MapComponent implements OnInit, AfterViewInit {\n  private map!: L.Map;\n  @ViewChild('mapContainer', { static: true }) mapContainer!: ElementRef;\n  @ViewChild('templatePopupContent') templatePopupContent!: TemplateRef<any>;\n\n  constructor(private mapPopupService: MapPopupService) {}\n\n  ngOnInit(): void {}\n\n  ngAfterViewInit(): void {\n    this.initMap();\n    this.addMarkersWithPopups();\n  }\n\n  private initMap(): void {\n    this.map = L.map(this.mapContainer.nativeElement).setView([39.9334, 32.8597], 10); \/\/ Ankara merkez\n\n    L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\n      attribution: '&copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap<\/a> contributors'\n    }).addTo(this.map);\n  }\n\n  private addMarkersWithPopups(): void {\n    \/\/ 1. Angular Bile\u015feni ile Popup (Marker 1)\n    const marker1 = L.marker([39.9334, 32.8597], {\n      icon: L.icon({\n        iconUrl: 'assets\/marker-icon.png', \/\/ Kendi marker ikonunuzu kullanabilirsiniz\n        shadowUrl: 'assets\/marker-shadow.png',\n        iconSize: [25, 41],\n        iconAnchor: [12, 41],\n        popupAnchor: [1, -34],\n        shadowSize: [41, 41]\n      })\n    }).addTo(this.map);\n\n    marker1.on('click', (e) => {\n      this.mapPopupService.openComponentPopup(\n        this.map,\n        e.latlng,\n        MarkerPopupComponent,\n        { title: 'Ankara Kalesi', description: 'Ankara\\'n\u0131n tarihi simgesi ve panoramik \u015fehir manzaras\u0131 sunar.', additionalInfo: 'Giri\u015f \u00fccreti al\u0131nabilir.' },\n        { closeButton: true, maxWidth: 350, className: 'component-popup-style' }\n      );\n    });\n\n    \/\/ 2. Angular \u015eablonu ile Popup (Marker 2)\n    const marker2 = L.marker([39.91, 32.78], {\n      icon: L.icon({\n        iconUrl: 'assets\/marker-icon-2x.png', \/\/ Farkl\u0131 bir ikon\n        shadowUrl: 'assets\/marker-shadow.png',\n        iconSize: [25, 41],\n        iconAnchor: [12, 41],\n        popupAnchor: [1, -34],\n        shadowSize: [41, 41]\n      })\n    }).addTo(this.map);\n\n    marker2.on('click', (e) => {\n      if (this.templatePopupContent) {\n        this.mapPopupService.openTemplatePopup(\n          this.map,\n          e.latlng,\n          this.templatePopupContent,\n          { title: 'Atakule', description: 'Ankara\\'n\u0131n modern sembol\u00fc, al\u0131\u015fveri\u015f ve seyir teras\u0131.' },\n          { closeButton: false, autoClose: true, className: 'custom-template-popup', maxWidth: 300 }\n        );\n      }\n    });\n\n    \/\/ 3. Basit Leaflet Popup (Kar\u015f\u0131la\u015ft\u0131rma i\u00e7in Marker 3)\n    const marker3 = L.marker([39.95, 32.95]).addTo(this.map);\n    marker3.bindPopup('<b>Merhaba!<\/b><br><i>Bu basit bir Leaflet popup.<\/i>').openPopup();\n  }\n\n  \/\/ \u015eablon i\u00e7inden \u00e7a\u011fr\u0131lacak bir metot\n  alertFromTemplate(title: string): void {\n    alert(<code>Template'ten gelen bilgi: ${title}<\/code>);\n  }\n}<\/code><\/pre>\n<p><strong><code>assets<\/code> Klas\u00f6r\u00fc Notu:<\/strong> Yukar\u0131daki kodda <code>assets\/marker-icon.png<\/code>, <code>assets\/marker-shadow.png<\/code> gibi ikon yollar\u0131 kullan\u0131lm\u0131\u015ft\u0131r. Bu dosyalar\u0131n <code>src\/assets<\/code> klas\u00f6r\u00fcn\u00fczde bulundu\u011fundan emin olun. Leaflet&#8217;in varsay\u0131lan ikonlar\u0131 bazen CDN&#8217;den y\u00fcklenirken sorun \u00e7\u0131karabilir, bu nedenle yerel kopyalar\u0131n\u0131 kullanmak iyi bir uygulamad\u0131r.<\/p>\n<p>Bu kurulum ile art\u0131k harita \u00fczerindeki i\u015faret\u00e7ilere t\u0131kland\u0131\u011f\u0131nda, Angular&#8217;\u0131n tam g\u00fcc\u00fcne sahip etkile\u015fimli popuplar a\u00e7\u0131lacakt\u0131r. <code>MarkerPopupComponent<\/code>&#8216;in <code>ngOnInit<\/code> ve <code>ngOnDestroy<\/code> konsol \u00e7\u0131kt\u0131lar\u0131n\u0131 inceleyerek, servisimizin bile\u015fen ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc do\u011fru y\u00f6netti\u011fini g\u00f6rebilirsiniz. Popup a\u00e7\u0131ld\u0131\u011f\u0131nda <code>ngOnInit<\/code> tetiklenecek, kapand\u0131\u011f\u0131nda ise <code>ngOnDestroy<\/code> tetiklenecektir.<\/p>\n<h3>Geli\u015fmi\u015f Konular ve Dikkate Al\u0131nmas\u0131 Gerekenler<\/h3>\n<p>Popup servisimiz, Angular bile\u015fenlerini Leaflet popuplar\u0131na entegre etmek i\u00e7in sa\u011flam bir temel sunar. Ancak, daha karma\u015f\u0131k senaryolar veya optimizasyonlar i\u00e7in baz\u0131 geli\u015fmi\u015f konular\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak faydal\u0131 olacakt\u0131r:<\/p>\n<p>1.  <strong>Dinamik Veri Aktar\u0131m\u0131 ve Geri Bildirim:<\/strong><br \/>\n    *   <strong>\u00c7oklu <code>@Input<\/code>:<\/strong> Servisimizdeki <code>data<\/code> nesnesini kullanarak, popup bile\u015fenine birden fazla <code>@Input<\/code> \u00f6zelli\u011fi aktarabilirsiniz (<code>Object.assign(componentRef.instance, data)<\/code>).<br \/>\n    *   <strong><code>@Output<\/code> Olaylar\u0131:<\/strong> Popup bile\u015feninizdeki <code>@Output<\/code> EventEmitter&#8217;lar\u0131n\u0131 dinlemek i\u00e7in, <code>componentRef.instance.detailsClicked.subscribe(...)<\/code> gibi bir yap\u0131 kullanabilirsiniz. Bu sayede popup i\u00e7indeki bir eylem (\u00f6rne\u011fin bir d\u00fc\u011fme t\u0131klamas\u0131) harita bile\u015fenine geri bildirim sa\u011flayabilir.<br \/>\n    *   <strong>Servis Payla\u015f\u0131m\u0131:<\/strong> Popup bile\u015feniniz, Angular&#8217;\u0131n ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu sayesinde di\u011fer servisleri (\u00f6rne\u011fin bir veri servisi) kullanabilir. Bu, popup i\u00e7inde karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131 y\u00fcr\u00fctmenizi sa\u011flar.<\/p>\n<p>2.  <strong>Performans ve Bellek Y\u00f6netimi:<\/strong><br \/>\n    *   Her popup a\u00e7\u0131ld\u0131\u011f\u0131nda yeni bir Angular bile\u015feni olu\u015fturulur ve kapat\u0131ld\u0131\u011f\u0131nda yok edilir. \u00c7ok say\u0131da dinamik popup&#8217;\u0131 ayn\u0131 anda a\u00e7\u0131p kapatmak, \u00f6zellikle karma\u015f\u0131k bile\u015fenler kullan\u0131l\u0131yorsa performans \u00fczerinde etkili olabilir.<br \/>\n    *   <code>appRef.attachView()<\/code> ve <code>appRef.detachView()<\/code> metodlar\u0131, Angular&#8217;\u0131n de\u011fi\u015fiklik alg\u0131lama mekanizmas\u0131n\u0131n do\u011fru \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar ancak dikkatli kullan\u0131lmal\u0131d\u0131r. Servisimizdeki <code>popup.on('remove', ...)<\/code> ile temizleme ad\u0131m\u0131 bu bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in kritik \u00f6neme sahiptir.<br \/>\n    *   E\u011fer ayn\u0131 anda binlerce i\u015faret\u00e7iniz varsa ve her biri i\u00e7in dinamik popup gerekiyorsa, performans optimizasyonu i\u00e7in sanalla\u015ft\u0131rma (virtualization) veya k\u00fcmeleme (clustering) gibi teknikleri d\u00fc\u015f\u00fcnmeniz gerekebilir.<\/p>\n<p>3.  <strong>Styling ve Temaland\u0131rma:<\/strong><br \/>\n    *   Leaflet popuplar\u0131n\u0131n varsay\u0131lan stillerini ge\u00e7ersiz k\u0131lmak i\u00e7in global CSS kurallar\u0131 (\u00f6rne\u011fin <code>leaflet-popup-content-wrapper<\/code>, <code>leaflet-popup-tip<\/code>) veya popup se\u00e7eneklerinde <code>className<\/code> kullanarak \u00f6zel s\u0131n\u0131flar tan\u0131mlayabilirsiniz.<br \/>\n    *   Angular bile\u015fenlerinizin kendi kaps\u00fcllenmi\u015f stilleri (<code>styles<\/code> veya <code>styleUrls<\/code> ile) Leaflet popup&#8217;\u0131 i\u00e7inde de uygulanacakt\u0131r.<br \/>\n    *   Temaland\u0131rma (\u00f6rne\u011fin Angular Material veya Bootstrap ile), popup i\u00e7eri\u011finin uygulaman\u0131z\u0131n genel g\u00f6r\u00fcn\u00fcm\u00fcne uyum sa\u011flamas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<p>4.  <strong>Alternatif Yakla\u015f\u0131mlar:<\/strong><br \/>\n    *   <strong><code>ngx-leaflet<\/code> veya Benzeri K\u00fct\u00fcphaneler:<\/strong> E\u011fer uygulaman\u0131z <code>ngx-leaflet<\/code> gibi Angular i\u00e7in tasarlanm\u0131\u015f Leaflet sarmalay\u0131c\u0131 k\u00fct\u00fcphaneler kullan\u0131yorsa, bu k\u00fct\u00fcphanelerin genellikle popuplar\u0131 Angular bile\u015fenleriyle entegre etmek i\u00e7in kendi yerle\u015fik mekanizmalar\u0131 bulunur. Bu servis, s\u0131f\u0131rdan Leaflet entegrasyonu yapanlar i\u00e7in veya bu k\u00fct\u00fcphanelerin sundu\u011fundan daha fazla kontrol isteyenler i\u00e7in idealdir.<br \/>\n    *   <strong>Basit HTML Stringleri:<\/strong> E\u011fer popup i\u00e7eri\u011finizde Angular&#8217;a \u00f6zg\u00fc bir etkile\u015fim veya veri ba\u011flama ihtiyac\u0131n\u0131z yoksa, hala Leaflet&#8217;in <code>bindPopup('<\/p>\n<div>Basit HTML<\/div>\n<p>')<\/code> metodunu kullanmak en basit ve en performansl\u0131 yoldur. Servisimiz, sadece Angular&#8217;\u0131n dinamik \u00f6zelliklerinden yararlanmak istedi\u011finizde devreye girmelidir.<\/p>\n<p>5.  <strong>Hata Y\u00f6netimi ve G\u00fcvenlik:<\/strong><br \/>\n    *   Dinamik bile\u015fen olu\u015fturma s\u0131ras\u0131nda olu\u015fabilecek hatalar\u0131 (\u00f6rne\u011fin, yanl\u0131\u015f bile\u015fen tipi verilmesi) ele almak i\u00e7in uygun try-catch bloklar\u0131 veya hata raporlama mekanizmalar\u0131 ekleyebilirsiniz.<br \/>\n    *   Kullan\u0131c\u0131dan al\u0131nan verileri popup i\u00e7eri\u011finde g\u00f6sterirken XSS (Cross-Site Scripting) sald\u0131r\u0131lar\u0131na kar\u015f\u0131 dikkatli olun. Angular, varsay\u0131lan olarak XSS korumas\u0131 sa\u011flar, ancak manuel DOM manip\u00fclasyonu yaparken bu korumalar\u0131 a\u015fmamaya \u00f6zen g\u00f6sterin.<\/p>\n<p>Bu geli\u015fmi\u015f konular\u0131 dikkate alarak, uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na g\u00f6re popup servisinizi daha da g\u00fc\u00e7lendirebilir ve optimize edebilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, Angular ve Leaflet entegrasyon serimizin \u00fc\u00e7\u00fcnc\u00fc b\u00f6l\u00fcm\u00fc olarak, haritalar\u0131m\u0131za dinamik ve etkile\u015fimli popuplar eklemeyi \u00f6\u011frendik. Leaflet&#8217;in temel popup \u00f6zelliklerinin \u00f6tesine ge\u00e7erek, Angular bile\u015fenlerini ve \u015fablonlar\u0131n\u0131 Leaflet popuplar\u0131n\u0131n i\u00e7ine yerle\u015ftirmemizi sa\u011flayan g\u00fc\u00e7l\u00fc bir &#8220;Popup Servisi&#8221; tasarlad\u0131k ve uygulad\u0131k.<\/p>\n<p>Bu servis sayesinde:<br \/>\n*   Angular bile\u015fenlerinin t\u00fcm ya\u015fam d\u00f6ng\u00fcs\u00fc (olu\u015fturma, veri aktar\u0131m\u0131, yok etme) Leaflet popuplar\u0131 i\u00e7inde do\u011fru bir \u015fekilde y\u00f6netilir.<br \/>\n*   <code>@Input<\/code> ile kolayca veri aktar\u0131m\u0131 yapabilir ve <code>@Output<\/code> ile popup i\u00e7indeki olaylar\u0131 ana bile\u015fenimize geri bildirebiliriz.<br \/>\n*   <code>ng-template<\/code> kullanarak daha esnek ve hafif popup i\u00e7erikleri olu\u015fturabiliriz.<br \/>\n*   Kod tekrar\u0131n\u0131 azalt\u0131r, kodumuzu daha mod\u00fcler ve s\u00fcrd\u00fcr\u00fclebilir hale getiririz.<\/p>\n<p>Art\u0131k haritalar\u0131n\u0131z sadece statik bilgi g\u00f6stermekle kalmayacak, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n\u0131zla zengin ve anlaml\u0131 etkile\u015fimler kurabilecek. Bu, modern web harita uygulamalar\u0131 i\u00e7in vazge\u00e7ilmez bir \u00f6zelliktir.<\/p>\n<p>Serimizin bir sonraki b\u00f6l\u00fcm\u00fcnde, haritalar\u0131m\u0131za daha karma\u015f\u0131k \u00e7izim ara\u00e7lar\u0131 (drawing tools) ekleyerek kullan\u0131c\u0131lar\u0131n kendi co\u011frafi verilerini olu\u015fturmas\u0131na veya d\u00fczenlemesine olanak tan\u0131yaca\u011f\u0131z. Harita geli\u015ftirme yolculu\u011funuzda ba\u015far\u0131lar dileriz!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi\nGiri\u015f: Haritalar\u0131n\u0131z\u0131 Etkile\u015fimli Hale Getirin\nAngular ve Leaflet kullanarak","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-31189","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 ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi - 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\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi\" \/>\n<meta property=\"og:description\" content=\"Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi Giri\u015f: Haritalar\u0131n\u0131z\u0131 Etkile\u015fimli Hale Getirin Angular ve Leaflet kullanarak\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-06T22:41:18+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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi\",\"datePublished\":\"2025-10-06T22:41:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/\"},\"wordCount\":2722,\"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-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/\",\"name\":\"Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-06T22:41:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi\"}]},{\"@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 ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi - 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\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/","og_locale":"tr_TR","og_type":"article","og_title":"Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi","og_description":"Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi Giri\u015f: Haritalar\u0131n\u0131z\u0131 Etkile\u015fimli Hale Getirin Angular ve Leaflet kullanarak","og_url":"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-06T22:41:18+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi","datePublished":"2025-10-06T22:41:18+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/"},"wordCount":2722,"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-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/","url":"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/","name":"Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-06T22:41:18+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-leaflet-ile-harita-olusturma-bolum-3-popup-servisi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular ve Leaflet ile Harita Olu\u015fturma, B\u00f6l\u00fcm 3: Popup Servisi"}]},{"@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\/31189","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=31189"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31189\/revisions"}],"predecessor-version":[{"id":31190,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31189\/revisions\/31190"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}