{"id":33014,"date":"2025-10-28T12:41:25","date_gmt":"2025-10-28T09:41:25","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33014"},"modified":"2025-10-28T12:41:25","modified_gmt":"2025-10-28T09:41:25","slug":"angularda-ng-content-ile-icerik-yansitma-content-projection","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/","title":{"rendered":"Angular&#8217;da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection)"},"content":{"rendered":"<p><body><\/p>\n<h2>Angular&#8217;da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection)<\/h2>\n<p>Angular, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir framework&#8217;t\u00fcr. Bile\u015fen tabanl\u0131 mimarisi sayesinde, UI elemanlar\u0131n\u0131 yeniden kullan\u0131labilir ve y\u00f6netilebilir par\u00e7alara ay\u0131rmam\u0131z\u0131 sa\u011flar. Bu par\u00e7alar\u0131n en g\u00fc\u00e7l\u00fc y\u00f6nlerinden biri de &#8220;i\u00e7erik yans\u0131tma&#8221; (content projection) yetene\u011fidir. \u0130\u00e7erik yans\u0131tma, bir bile\u015fenin, ba\u015fka bir bile\u015fen taraf\u0131ndan sa\u011flanan i\u00e7eri\u011fi kendi \u015fablonunda belirli bir yere yerle\u015ftirmesine olanak tan\u0131yan bir mekanizmad\u0131r. Bu, bile\u015fenlerin daha genel, esnek ve yeniden kullan\u0131labilir olmas\u0131n\u0131 sa\u011flar, \u00e7\u00fcnk\u00fc belirli bir i\u00e7eri\u011fi sert kodlamak yerine, d\u0131\u015far\u0131dan dinamik olarak alabilirler.<\/p>\n<p>Bu makalede, Angular&#8217;da i\u00e7erik yans\u0131tman\u0131n temel prensiplerini, <code>ng-content<\/code> direktifini kullanarak nas\u0131l yap\u0131ld\u0131\u011f\u0131n\u0131, <code>select<\/code> \u00f6zniteli\u011fi ile \u00e7oklu i\u00e7erik yans\u0131tma senaryolar\u0131n\u0131, <code>ngTemplateOutlet<\/code> ile farklar\u0131n\u0131, geli\u015fmi\u015f kullan\u0131m durumlar\u0131n\u0131 (varsay\u0131lan i\u00e7erik, <code>@ContentChild<\/code>\/@ContentChildren<code>) ve en iyi uygulamalar\u0131 derinlemesine inceleyece\u011fiz. Amac\u0131m\u0131z, Angular geli\u015ftiricilerinin bu g\u00fc\u00e7l\u00fc \u00f6zelli\u011fi ustaca kullanabilmeleri i\u00e7in kapsaml\u0131 bir rehber sunmakt\u0131r.<\/p>\n<h2>Temel Kavramlar ve <\/code>ng-content<code><\/h2>\n<p>Angular'da i\u00e7erik yans\u0131tma, bile\u015fenler aras\u0131 ileti\u015fimin ve esnekli\u011fin temelini olu\u015fturur. Bir bile\u015fenin, \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 yerden ald\u0131\u011f\u0131 HTML i\u00e7eri\u011fini kendi \u015fablonunda bir \"yer tutucuya\" yerle\u015ftirmesi prensibine dayan\u0131r. Bu yer tutucunun ad\u0131 <\/code>ng-content<code>'tir.<\/p>\n<h3><\/code>ng-content<code> Nedir?<\/h3>\n<p><\/code>ng-content<code>, Angular'da i\u00e7erik yans\u0131tma i\u00e7in kullan\u0131lan \u00f6zel bir etikettir. Bir bile\u015fenin \u015fablonunda yer ald\u0131\u011f\u0131nda, o bile\u015fene d\u0131\u015far\u0131dan (yani onu \u00e7a\u011f\u0131ran \u00fcst bile\u015fenden) ge\u00e7irilen HTML i\u00e7eri\u011finin nerede g\u00f6sterilece\u011fini belirtir. <\/code>ng-content<code> etiketi, DOM'da ger\u00e7ek bir HTML eleman\u0131 olarak yer almaz; bunun yerine, Angular'\u0131n render s\u00fcreci s\u0131ras\u0131nda, yerine yans\u0131t\u0131lan i\u00e7erik ile de\u011fi\u015ftirilir. Bu, bile\u015fenlerin daha soyut ve genel ama\u00e7l\u0131 tasarlanmas\u0131n\u0131 m\u00fcmk\u00fcn k\u0131lar. \u00d6rne\u011fin, bir <\/code>Card<code> bile\u015feni olu\u015fturdu\u011funuzda, kart\u0131n ba\u015fl\u0131\u011f\u0131n\u0131, g\u00f6vdesini ve alt bilgisini sert kodlamak yerine, bu alanlar\u0131 <\/code>ng-content<code> ile tan\u0131mlayarak, her kart\u0131n farkl\u0131 bir i\u00e7eri\u011fe sahip olmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<h3>Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>\u0130\u00e7erik yans\u0131tma, bir \u00fcst bile\u015fenin (parent component) alt bile\u015feni (child component) \u00e7a\u011f\u0131r\u0131rken, alt bile\u015fenin etiketleri aras\u0131na yerle\u015ftirdi\u011fi HTML i\u00e7eri\u011fini alt bile\u015fenin kendi \u015fablonunda <\/code>ng-content<code> etiketinin bulundu\u011fu yere ta\u015f\u0131mas\u0131 prensibiyle \u00e7al\u0131\u015f\u0131r.<\/p>\n<p>Basit bir \u00f6rnekle a\u00e7\u0131klayal\u0131m:<\/p>\n<p>\u00d6nce, i\u00e7eri\u011fi yans\u0131tacak olan alt bile\u015fenimizi (<\/code>ChildComponent<code>) olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-typescript\">\/\/ child.component.ts\nimport { Component } from '@angular\/core';\n\n@Component({\n  selector: 'app-child',\n  template: <\/code>\n    <div style=\"border: 1px solid blue; padding: 10px;\">\n      <h3>Alt Bile\u015fen Ba\u015fl\u0131\u011f\u0131<\/h3>\n      <ng-content><\/ng-content>\n      <p>Alt bile\u015fenin kendi i\u00e7eri\u011fi.<\/p>\n    <\/div>\n  <code>,\n  styles: []\n})\nexport class ChildComponent {}<\/code><\/pre>\n<p>\u015eimdi de bu <\/code>ChildComponent<code>'i kullanacak olan \u00fcst bile\u015fenimizi (<\/code>ParentComponent<code>) olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-typescript\">\/\/ parent.component.ts\nimport { Component } from '@angular\/core';\n\n@Component({\n  selector: 'app-parent',\n  template: <\/code>\n    <div style=\"border: 1px solid green; padding: 20px;\">\n      <h2>\u00dcst Bile\u015fen Ba\u015fl\u0131\u011f\u0131<\/h2>\n      <app-child>\n        <p>Bu i\u00e7erik \u00fcst bile\u015fenden geliyor ve alt bile\u015fene yans\u0131t\u0131lacak!<\/p>\n        <strong>Merhaba d\u00fcnya!<\/strong>\n      <\/app-child>\n    <\/div>\n  <code>,\n  styles: []\n})\nexport class ParentComponent {}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <\/code>app-parent<code> bile\u015feni <\/code>app-child<code> bile\u015fenini \u00e7a\u011f\u0131r\u0131rken, <\/code><app-child><code> etiketleri aras\u0131na bir <\/code><\/p>\n<p><code> etiketi ve bir <\/code><strong><code> etiketi yerle\u015ftiriyor. <\/code>app-child<code> bile\u015feninin \u015fablonundaki <\/code><ng-content><code> etiketi, tam olarak bu <\/code><\/p>\n<p><code> ve <\/code><strong><code> etiketlerinin g\u00f6sterilece\u011fi yerdir. Sonu\u00e7 olarak, taray\u0131c\u0131da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz DOM yap\u0131s\u0131, <\/code><app-child><code> etiketleri aras\u0131na koydu\u011funuz i\u00e7eri\u011fin <\/code><ng-content><code> yerine yerle\u015ftirilmi\u015f hali olacakt\u0131r.<\/p>\n<h3>Tek Bir <\/code>ng-content<code> Kullan\u0131m\u0131<\/h3>\n<p>Yukar\u0131daki \u00f6rnek, <\/code>ng-content<code>'in en temel kullan\u0131m \u015feklidir: tek bir yer tutucu ile t\u00fcm yans\u0131t\u0131lan i\u00e7eri\u011fi tek bir noktaya yerle\u015ftirmek. E\u011fer bir bile\u015fende birden fazla <\/code>ng-content<code> etiketi kullan\u0131rsan\u0131z ve bunlara herhangi bir <\/code>select<code> \u00f6zniteli\u011fi vermezseniz, Angular yaln\u0131zca ilk <\/code>ng-content<code> etiketine i\u00e7eri\u011fi yans\u0131t\u0131r ve di\u011ferlerini g\u00f6z ard\u0131 eder. Bu nedenle, birden fazla i\u00e7erik slotuna ihtiyac\u0131n\u0131z oldu\u011funda <\/code>select<code> \u00f6zniteli\u011fini kullanman\u0131z gerekir.<\/p>\n<p>Tek bir <\/code>ng-content<code> genellikle basit bile\u015fenler (\u00f6rne\u011fin, bir uyar\u0131 mesaj\u0131 kutusu veya genel bir panel) i\u00e7in yeterlidir, burada t\u00fcm d\u0131\u015f i\u00e7eri\u011fin tek bir blok olarak ele al\u0131nmas\u0131 beklenir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ alert.component.ts\nimport { Component } from '@angular\/core';\n\n@Component({\n  selector: 'app-alert',\n  template: <\/code>\n    <div class=\"alert\">\n      <div class=\"alert-icon\">\u26a0\ufe0f<\/div>\n      <div class=\"alert-content\">\n        <ng-content><\/ng-content>\n      <\/div>\n    <\/div>\n  <code>,\n  styles: [<\/code>\n    .alert { display: flex; align-items: center; padding: 10px; border: 1px solid orange; border-radius: 4px; background-color: #fff3e0; }\n    .alert-icon { font-size: 24px; margin-right: 10px; }\n    .alert-content { flex-grow: 1; }\n  <code>]\n})\nexport class AlertComponent {}<\/code><\/pre>\n<p>Kullan\u0131m\u0131:<\/p>\n<pre><code class=\"language-html\"><!-- app.component.html -->\n<app-alert>\n  <p>Bu bir <strong>\u00f6nemli uyar\u0131d\u0131r<\/strong>. L\u00fctfen dikkatli okuyunuz.<\/p>\n<\/app-alert>\n\n<app-alert>\n  <span>Sadece basit bir bilgi mesaj\u0131.<\/span>\n<\/app-alert><\/code><\/pre>\n<p>Bu \u015fekilde, <\/code>AlertComponent<code> i\u00e7eri\u011fi nas\u0131l bi\u00e7imlendirece\u011fine karar verirken, mesaj\u0131n kendisi d\u0131\u015far\u0131dan dinamik olarak sa\u011flan\u0131r. Bu, bile\u015fenin yeniden kullan\u0131labilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h2>\u00c7oklu \u0130\u00e7erik Yans\u0131tma: <\/code>select<code> \u00d6zniteli\u011fi<\/h2>\n<p>Baz\u0131 durumlarda, bir bile\u015fenin \u015fablonunda tek bir i\u00e7erik alan\u0131 yeterli olmayabilir. \u00d6rne\u011fin, bir <\/code>Card<code> bile\u015feni tasarlarken, kart\u0131n ba\u015fl\u0131\u011f\u0131, g\u00f6vdesi ve alt bilgisi gibi farkl\u0131 b\u00f6l\u00fcmlerine farkl\u0131 i\u00e7erikler yerle\u015ftirmek isteyebiliriz. \u0130\u015fte bu noktada <\/code>ng-content<code>'in <\/code>select<code> \u00f6zniteli\u011fi devreye girer. <\/code>select<code> \u00f6zniteli\u011fi, yans\u0131t\u0131lacak i\u00e7eri\u011fi belirli CSS se\u00e7icileri kullanarak filtrelememizi ve farkl\u0131 <\/code>ng-content<code> slotlar\u0131na y\u00f6nlendirmemizi sa\u011flar.<\/p>\n<h3>Neden <\/code>select<code>'e \u0130htiya\u00e7 Duyar\u0131z?<\/h3>\n<p><\/code>select<code> \u00f6zniteli\u011fi, bir bile\u015fenin birden fazla \"i\u00e7erik slotu\" tan\u0131mlamas\u0131na olanak tan\u0131r. Her <\/code>ng-content<code> etiketine benzersiz bir <\/code>select<code> de\u011feri atayarak, \u00fcst bile\u015fenden gelen i\u00e7eri\u011fi, bu se\u00e7icilere uyan elemanlara g\u00f6re farkl\u0131 yerlere y\u00f6nlendirebiliriz. Bu, bile\u015fenlerin daha karma\u015f\u0131k ve yap\u0131land\u0131r\u0131lm\u0131\u015f i\u00e7erikleri esnek bir \u015fekilde bar\u0131nd\u0131rmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>\u00d6rne\u011fin, bir <\/code>Panel<code> bile\u015feni d\u00fc\u015f\u00fcn\u00fcn. Bu panelin bir ba\u015fl\u0131k b\u00f6l\u00fcm\u00fc, bir g\u00f6vde b\u00f6l\u00fcm\u00fc ve iste\u011fe ba\u011fl\u0131 bir eylem d\u00fc\u011fmeleri b\u00f6l\u00fcm\u00fc olabilir. <\/code>select<code> olmadan, t\u00fcm i\u00e7eri\u011fi tek bir <\/code>ng-content<code>'e yans\u0131t\u0131r\u0131z ve i\u00e7 yap\u0131y\u0131 y\u00f6netmek zorla\u015f\u0131r. <\/code>select<code> ile ise her b\u00f6l\u00fcm i\u00e7in ayr\u0131 bir <\/code>ng-content<code> tan\u0131mlayabiliriz.<\/p>\n<h3><\/code>select<code> ile Se\u00e7im Mekanizmalar\u0131<\/h3>\n<p><\/code>select<code> \u00f6zniteli\u011fi, CSS se\u00e7icilerine benzer bir s\u00f6zdizimi kullan\u0131r. A\u015fa\u011f\u0131daki se\u00e7icileri destekler:<\/p>\n<p>1.  <strong>HTML Element Ad\u0131:<\/strong> Belirli bir HTML etiketiyle e\u015fle\u015fir.<br \/>\n    *   \u00d6rnek: <\/code>select=&#8221;h2&#8243;<code>, <\/code>select=&#8221;p&#8221;<code><\/p>\n<p>2.  <strong>CSS S\u0131n\u0131f\u0131:<\/strong> Belirli bir CSS s\u0131n\u0131f\u0131na sahip elemanlarla e\u015fle\u015fir.<br \/>\n    *   \u00d6rnek: <\/code>select=&#8221;.card-title&#8221;<code>, <\/code>select=&#8221;.card-body&#8221;<code><\/p>\n<p>3.  <strong>ID:<\/strong> Belirli bir ID'ye sahip elemanla e\u015fle\u015fir. (Genellikle tekil elemanlar i\u00e7in kullan\u0131l\u0131r.)<br \/>\n    *   \u00d6rnek: <\/code>select=&#8221;#my-header&#8221;<code><\/p>\n<p>4.  <strong>Nitelik (Attribute):<\/strong> Belirli bir HTML niteli\u011fine sahip elemanlarla e\u015fle\u015fir.<br \/>\n    *   \u00d6rnek: <\/code>select=&#8221;[header]&#8221;<code> (header niteli\u011fi olan t\u00fcm elemanlar), <\/code>select=&#8221;[role=&#8217;footer&#8217;]&#8221;<code><\/p>\n<p>5.  <strong>Angular Se\u00e7iciler (Component, Directive):<\/strong> Belirli bir Angular bile\u015feni veya direktifiyle e\u015fle\u015fir.<br \/>\n    *   \u00d6rnek: <\/code>select=&#8221;app-my-component&#8221;<code><\/p>\n<p><strong>\u00d6nemli Not:<\/strong> E\u011fer hi\u00e7bir <\/code>ng-content<code> etiketi <\/code>select<code> \u00f6zniteli\u011fi belirtmezse veya bir <\/code>select<code> \u00f6zniteli\u011fi hi\u00e7bir i\u00e7eri\u011fi yakalamazsa, t\u00fcm \"se\u00e7ilmemi\u015f\" i\u00e7erik, <\/code>select<code> \u00f6zniteli\u011fi olmayan ilk <\/code>ng-content<code> etiketine yans\u0131t\u0131l\u0131r. E\u011fer <\/code>select<code> \u00f6zniteli\u011fi olmayan bir <\/code>ng-content<code> yoksa, se\u00e7ilmemi\u015f i\u00e7erik render edilmez.<\/p>\n<h3>\u00d6rnekler ve Uygulama<\/h3>\n<p>Bir <\/code>Card<code> bile\u015feni \u00fczerinden farkl\u0131 <\/code>select<code> mekanizmalar\u0131n\u0131 inceleyelim:<\/p>\n<pre><code class=\"language-typescript\">\/\/ card.component.ts\nimport { Component } from '@angular\/core';\n\n@Component({\n  selector: 'app-card',\n  template: <\/code>\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <ng-content select=\"[card-header]\"><\/ng-content>\n      <\/div>\n      <div class=\"card-body\">\n        <ng-content select=\".card-content\"><\/ng-content>\n        <ng-content><\/ng-content> <!-- Se\u00e7ilmemi\u015f di\u011fer i\u00e7erikler buraya gelir -->\n      <\/div>\n      <div class=\"card-footer\">\n        <ng-content select=\"app-card-actions\"><\/ng-content>\n      <\/div>\n    <\/div>\n  <code>,\n  styles: [<\/code>\n    .card { border: 1px solid #ccc; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); margin: 15px; width: 300px; }\n    .card-header { padding: 10px 15px; border-bottom: 1px solid #eee; background-color: #f8f8f8; font-weight: bold; }\n    .card-body { padding: 15px; }\n    .card-footer { padding: 10px 15px; border-top: 1px solid #eee; background-color: #f8f8f8; text-align: right; }\n  <code>]\n})\nexport class CardComponent {}\n\n\/\/ card-actions.component.ts (bir ba\u015fka bile\u015fen)\nimport { Component } from '@angular\/core';\n\n@Component({\n  selector: 'app-card-actions',\n  template: <\/code>\n    <div style=\"display: flex; justify-content: flex-end; gap: 10px;\">\n      <ng-content><\/ng-content>\n    <\/div>\n  <code>\n})\nexport class CardActionsComponent {}<\/code><\/pre>\n<p>\u015eimdi bu <\/code>CardComponent<code>'i kullanal\u0131m:<\/p>\n<pre><code class=\"language-html\"><!-- app.component.html -->\n<app-card>\n  <!-- Nitelik Se\u00e7ici: [card-header] -->\n  <h3 card-header>\u00dcr\u00fcn Detay\u0131<\/h3>\n\n  <!-- S\u0131n\u0131f Se\u00e7ici: .card-content -->\n  <div class=\"card-content\">\n    <p>Bu \u00fcr\u00fcn \u00e7ok kaliteli ve dayan\u0131kl\u0131d\u0131r. \u00d6zel indirimle sat\u0131\u015fta!<\/p>\n    <ul>\n      <li>\u00d6zellik 1<\/li>\n      <li>\u00d6zellik 2<\/li>\n    <\/ul>\n  <\/div>\n\n  <!-- Se\u00e7ilmemi\u015f i\u00e7erik (ikinci ng-content'e gider) -->\n  <small>Stokta s\u0131n\u0131rl\u0131 say\u0131da!<\/small>\n\n  <!-- Angular Bile\u015fen Se\u00e7ici: app-card-actions -->\n  <app-card-actions>\n    <button>Sepete Ekle<\/button>\n    <button style=\"background-color: #f44336; color: white;\">\u0130ptal<\/button>\n  <\/app-card-actions>\n<\/app-card><\/code><\/pre>\n<p>Bu \u00f6rnekte:<br \/>\n*   <\/code><\/p>\n<h3 card-header><code> etiketi, <\/code>select=&#8221;[card-header]&#8221;<code> olan <\/code>ng-content<code>'e yans\u0131t\u0131l\u0131r.<br \/>\n*   <\/code><\/p>\n<div class=\"card-content\"><code> etiketi, <\/code>select=&#8221;.card-content&#8221;<code> olan <\/code>ng-content<code>'e yans\u0131t\u0131l\u0131r.<br \/>\n*   <\/code><small><code> etiketi, herhangi bir <\/code>select<code> ile e\u015fle\u015fmedi\u011fi i\u00e7in, <\/code>select<code> \u00f6zniteli\u011fi olmayan ilk <\/code>ng-content<code>'e yans\u0131t\u0131l\u0131r (bu durumda <\/code>.card-body<code> i\u00e7indeki ikinci <\/code>ng-content<code>).<br \/>\n*   <\/code><app-card-actions><code> bile\u015feni, <\/code>select=&#8221;app-card-actions&#8221;<code> olan <\/code>ng-content<code>'e yans\u0131t\u0131l\u0131r. Ayr\u0131ca, <\/code>app-card-actions<code> bile\u015feninin i\u00e7indeki butonlar da kendi <\/code>ng-content<code>'i arac\u0131l\u0131\u011f\u0131yla yans\u0131t\u0131l\u0131r.<\/p>\n<p>Bu yap\u0131, bir bile\u015fenin farkl\u0131 k\u0131s\u0131mlar\u0131n\u0131n tamamen d\u0131\u015far\u0131dan kontrol edilebilmesini sa\u011flar, b\u00f6ylece bile\u015fen kendisi sadece d\u00fczeni ve stilini y\u00f6netir.<\/p>\n<h2>\u015eablon Referans De\u011fi\u015fkenleri ile \u0130\u00e7erik Yans\u0131tma: <\/code>ngTemplateOutlet<code> ve <\/code>ng-content<code>'in Farklar\u0131<\/h2>\n<p>Angular'da dinamik i\u00e7erik render etme ve bile\u015fen esnekli\u011fi sa\u011flamak i\u00e7in hem <\/code>ng-content<code> hem de <\/code>ngTemplateOutlet<code> kullan\u0131l\u0131r. Ancak, bu iki mekanizma farkl\u0131 senaryolar i\u00e7in tasarlanm\u0131\u015ft\u0131r ve farkl\u0131 kullan\u0131m \u015fekillerine sahiptir. Aralar\u0131ndaki fark\u0131 anlamak, do\u011fru arac\u0131 do\u011fru yerde kullanmak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3><\/code>ngTemplateOutlet<code>'in Rol\u00fc<\/h3>\n<p><\/code>ngTemplateOutlet<code>, bir <\/code>ng-template<code> etiketinde tan\u0131mlanm\u0131\u015f bir \u015fablonu, ba\u015fka bir yerde dinamik olarak render etmek i\u00e7in kullan\u0131lan bir yap\u0131sal direktiftir. <\/code>ng-template<code> kendisi DOM'a hi\u00e7bir \u015fey render etmez; sadece bir \u015fablon blo\u011fu tan\u0131mlar. <\/code>ngTemplateOutlet<code> ise bu \u015fablonu al\u0131r ve belirtilen yerde render eder. En \u00f6nemli \u00f6zelliklerinden biri, \u015fablona ba\u011flam (context) ge\u00e7irebilme yetene\u011fidir. Bu, \u015fablonun i\u00e7indeki de\u011fi\u015fkenlere d\u0131\u015far\u0131dan de\u011ferler sa\u011flamam\u0131z\u0131 sa\u011flar.<\/p>\n<p><\/code>ngTemplateOutlet<code> genellikle, bir bile\u015fenin i\u00e7 yap\u0131s\u0131n\u0131n sabit oldu\u011fu ancak baz\u0131 k\u0131s\u0131mlar\u0131n\u0131n g\u00f6r\u00fcn\u00fcm\u00fcn\u00fcn veya i\u00e7eri\u011finin \u00fcst bile\u015fen taraf\u0131ndan tamamen kontrol edilmesi istendi\u011fi durumlarda kullan\u0131l\u0131r. \u00d6rne\u011fin, bir liste bile\u015feni d\u00fc\u015f\u00fcn\u00fcn. Liste bile\u015feni, veriyi al\u0131p d\u00f6ng\u00fcye sokmaktan sorumludur, ancak her bir liste \u00f6\u011fesinin nas\u0131l g\u00f6r\u00fcnece\u011fine \u00fcst bile\u015fen karar verir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ list-renderer.component.ts\nimport { Component, Input, TemplateRef } from '@angular\/core';\n\n@Component({\n  selector: 'app-list-renderer',\n  template: <\/code>\n    <div class=\"list-container\">\n      <h3>Liste \u00d6\u011feleri:<\/h3>\n      <ng-container *ngFor=\"let item of items\">\n        <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item, index: i }\"><\/ng-container>\n      <\/ng-container>\n      <ng-content select=\"[list-footer]\"><\/ng-content>\n    <\/div>\n  <code>,\n  styles: [<\/code>\n    .list-container { border: 1px solid purple; padding: 10px; margin-top: 10px; }\n  <code>]\n})\nexport class ListRendererComponent {\n  @Input() items: any[] = [];\n  @Input() itemTemplate!: TemplateRef<any>;\n}<\/code><\/pre>\n<p>Kullan\u0131m\u0131:<\/p>\n<pre><code class=\"language-html\"><!-- app.component.html -->\n<app-list-renderer [items]=\"[{name: 'Elma', price: 10}, {name: 'Armut', price: 12}]\">\n  <ng-template #itemTemplate let-item let-i=\"index\">\n    <div style=\"border: 1px dashed gray; padding: 5px; margin-bottom: 5px;\">\n      {{ i + 1 }}. {{ item.name }} - Fiyat: {{ item.price }} TL\n    <\/div>\n  <\/ng-template>\n  <div list-footer>Toplam {{ items.length }} \u00fcr\u00fcn g\u00f6steriliyor.<\/div>\n<\/app-list-renderer><\/code><\/pre>\n<p>Bu \u00f6rnekte, <\/code>ListRendererComponent<code> her bir <\/code>item<code> i\u00e7in <\/code>itemTemplate<code>'i render eder ve <\/code>item<code> ile <\/code>index<code> de\u011ferlerini \u015fablona ba\u011flam olarak ge\u00e7irir.<\/p>\n<h3>Ne Zaman <\/code>ng-content<code>, Ne Zaman <\/code>ngTemplateOutlet<code>?<\/h3>\n<p>Bu iki mekanizma aras\u0131ndaki temel fark\u0131 \u00f6zetleyelim:<\/p>\n<p>*   <strong><\/code>ng-content<code>:<\/strong><br \/>\n    <em>   <strong>Ne zaman kullan\u0131l\u0131r:<\/strong> \u00dcst bile\u015fen, alt bile\u015fenin i\u00e7ine yerle\u015ftirilecek <\/em>ger\u00e7ek DOM i\u00e7eri\u011fini* (HTML elemanlar\u0131, metinler, di\u011fer bile\u015fenler) do\u011frudan tan\u0131mlad\u0131\u011f\u0131nda. Alt bile\u015fen bu i\u00e7eri\u011fi sadece kendi \u015fablonunda bir \"slot\"a yerle\u015ftirir.<br \/>\n    *   <strong>\u0130\u00e7erik kimin kontrol\u00fcnde:<\/strong> \u00dcst bile\u015fenin. Alt bile\u015fen sadece i\u00e7eri\u011fin nerede g\u00f6r\u00fcnece\u011fine karar verir.<br \/>\n    *   <strong>Ba\u011flam:<\/strong> Yans\u0131t\u0131lan i\u00e7erik, \u00fcst bile\u015fenin ba\u011flam\u0131nda (scope) \u00e7al\u0131\u015f\u0131r. Yani, yans\u0131t\u0131lan i\u00e7erik i\u00e7inde kullan\u0131lan de\u011fi\u015fkenler ve olay dinleyicileri \u00fcst bile\u015fene aittir.<br \/>\n    *   <strong>Kullan\u0131m senaryolar\u0131:<\/strong> Genel ama\u00e7l\u0131 kartlar, paneller, modal pencereler, uyar\u0131 kutular\u0131.<\/p>\n<p>*   <strong><\/code>ngTemplateOutlet<code>:<\/strong><br \/>\n    <em>   <strong>Ne zaman kullan\u0131l\u0131r:<\/strong> \u00dcst bile\u015fen, alt bile\u015fene bir <\/em>\u015fablon tan\u0131m\u0131* (bir <\/code>ng-template<code>) sa\u011flad\u0131\u011f\u0131nda. Alt bile\u015fen, bu \u015fablonu kendi i\u00e7indeki verilere g\u00f6re dinamik olarak render eder. Alt bile\u015fen, \u015fablona kendi ba\u011flam\u0131ndan (verilerinden) de\u011ferler ge\u00e7irebilir.<br \/>\n    *   <strong>\u0130\u00e7erik kimin kontrol\u00fcnde:<\/strong> \u015eablonun yap\u0131s\u0131 \u00fcst bile\u015fen taraf\u0131ndan tan\u0131mlan\u0131r, ancak \u015fablonun i\u00e7indeki veriler ve render edilme an\u0131 alt bile\u015fen taraf\u0131ndan kontrol edilir.<br \/>\n    *   <strong>Ba\u011flam:<\/strong> \u015eablon, <\/code>ngTemplateOutlet<code> taraf\u0131ndan render edildi\u011finde, <\/code>context<code> \u00f6zniteli\u011fi ile sa\u011flanan ba\u011flamda \u00e7al\u0131\u015f\u0131r. Bu, alt bile\u015fenin verilerini \u015fablona aktarmas\u0131n\u0131 sa\u011flar.<br \/>\n    *   <strong>Kullan\u0131m senaryolar\u0131:<\/strong> Dinamik listeler, tablolar, form elemanlar\u0131n\u0131n \u00f6zelle\u015ftirilmesi, \u00f6zel render ediciler (custom renderers).<\/p>\n<p><strong>\u00d6zetle:<\/strong><br \/>\n*   <\/code>ng-content<code>: \"Bana bu i\u00e7eri\u011fi ver, ben de onu buraya koyay\u0131m.\" (\u00dcst bile\u015fen i\u00e7eri\u011fi, alt bile\u015fen yerini belirler.)<br \/>\n*   <\/code>ngTemplateOutlet<code>: \"Bana bir \u015fablon ver, ben de kendi verilerimle onu istedi\u011fim zaman render edeyim.\" (\u00dcst bile\u015fen \u015fablonu, alt bile\u015fen veriyi ve render zaman\u0131n\u0131 belirler.)<\/p>\n<h3><\/code>ng-template<code> ve <\/code>ng-container<code>'\u0131n \u00d6nemi<\/h3>\n<p>Bu iki etiket, Angular'da g\u00f6r\u00fcnmez bir \u015fekilde DOM yap\u0131s\u0131n\u0131 manip\u00fcle etmek ve kontrol etmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><em>   <strong><\/code>ng-template<code>:<\/strong> Daha \u00f6nce de belirtildi\u011fi gibi, <\/code>ng-template<code> kendisi DOM'a hi\u00e7bir \u015fey render etmeyen bir etikettir. Sadece bir \u015fablon blo\u011fu tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r. <\/code><\/em>ngIf<code>, <\/code>*ngFor<code> gibi yap\u0131sal direktifler asl\u0131nda <\/code>ng-template<code>'e d\u00f6n\u00fc\u015f\u00fcr. <\/code>ngTemplateOutlet<code> ile birlikte kullan\u0131ld\u0131\u011f\u0131nda \u00e7ok g\u00fc\u00e7l\u00fcd\u00fcr.<\/p>\n<p><em>   <strong><\/code>ng-container<code>:<\/strong> Bu da DOM'a hi\u00e7bir \u015fey render etmeyen bir etikettir. Genellikle birden fazla eleman\u0131 gruplamak istedi\u011fimizde, ancak bu elemanlar\u0131 sarmalayacak fazladan bir HTML eleman\u0131 (\u00f6rne\u011fin bir <\/code>div<code>) eklemek istemedi\u011fimizde kullan\u0131l\u0131r. <\/code><\/em>ngIf<code> veya <\/code>*ngFor<code> gibi yap\u0131sal direktifleri birden fazla elemana uygulamak i\u00e7in de idealdir. \u0130\u00e7erik yans\u0131tma senaryolar\u0131nda, birden fazla eleman\u0131 tek bir <\/code>ng-content<code> slotuna y\u00f6nlendirmek i\u00e7in de kullan\u0131labilir, ancak <\/code>ng-content<code>'in kendisi de bir gruplama g\u00f6revi g\u00f6rd\u00fc\u011f\u00fc i\u00e7in bu daha az yayg\u0131nd\u0131r.<\/p>\n<p>\u00d6rne\u011fin, \u00fcst bile\u015fenden alt bile\u015fene birden fazla eleman\u0131 tek bir \"slot\"a yans\u0131tmak istedi\u011finizde, bunlar\u0131 bir <\/code>ng-container<code> i\u00e7ine alarak organize edebilirsiniz:<\/p>\n<pre><code class=\"language-html\"><!-- app.component.html -->\n<app-child>\n  <ng-container class=\"my-group\">\n    <p>Grup 1, Eleman 1<\/p>\n    <span>Grup 1, Eleman 2<\/span>\n  <\/ng-container>\n  <p>Grup d\u0131\u015f\u0131 eleman<\/p>\n<\/app-child><\/code><\/pre>\n<p><\/code>ChildComponent<code>'te <\/code>select=&#8221;.my-group&#8221;<code> kullanarak bu <\/code>ng-container<code>'\u0131 se\u00e7ebilirsiniz.<\/p>\n<h2>Geli\u015fmi\u015f \u0130\u00e7erik Yans\u0131tma Senaryolar\u0131<\/h2>\n<p><\/code>ng-content<code> sadece temel i\u00e7erik yerle\u015ftirme i\u00e7in de\u011fil, ayn\u0131 zamanda daha karma\u015f\u0131k ve dinamik senaryolarda da kullan\u0131labilir.<\/p>\n<h3>Varsay\u0131lan \u0130\u00e7erik<\/h3>\n<p>Bir <\/code>ng-content<code> slotuna hi\u00e7bir i\u00e7erik yans\u0131t\u0131lmad\u0131\u011f\u0131nda ne olmas\u0131n\u0131 istersiniz? Angular, bu durumlarda varsay\u0131lan bir i\u00e7erik tan\u0131mlaman\u0131za olanak tan\u0131r. E\u011fer bir <\/code>ng-content<code> etiketi i\u00e7ine herhangi bir HTML i\u00e7eri\u011fi yerle\u015ftirirseniz, bu i\u00e7erik yaln\u0131zca \u00fcst bile\u015fenden o <\/code>ng-content<code> slotuna kar\u015f\u0131l\u0131k gelen hi\u00e7bir i\u00e7erik yans\u0131t\u0131lmad\u0131\u011f\u0131nda g\u00f6sterilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ panel.component.ts\nimport { Component } from '@angular\/core';\n\n@Component({\n  selector: 'app-panel',\n  template: <\/code>\n    <div class=\"panel\">\n      <div class=\"panel-header\">\n        <ng-content select=\"[panel-title]\">\n          <!-- Varsay\u0131lan ba\u015fl\u0131k -->\n          Varsay\u0131lan Panel Ba\u015fl\u0131\u011f\u0131\n        <\/ng-content>\n      <\/div>\n      <div class=\"panel-body\">\n        <ng-content>\n          <!-- Varsay\u0131lan g\u00f6vde i\u00e7eri\u011fi -->\n          Bu panelin i\u00e7eri\u011fi sa\u011flanmad\u0131. L\u00fctfen i\u00e7erik ekleyin.\n        <\/ng-content>\n      <\/div>\n    <\/div>\n  <code>,\n  styles: [<\/code>\n    .panel { border: 1px solid #ddd; border-radius: 5px; margin: 10px; width: 300px; }\n    .panel-header { background-color: #f0f0f0; padding: 10px; font-weight: bold; }\n    .panel-body { padding: 10px; }\n  <code>]\n})\nexport class PanelComponent {}<\/code><\/pre>\n<p>Kullan\u0131m\u0131:<\/p>\n<pre><code class=\"language-html\"><!-- app.component.html -->\n\n<!-- \u0130\u00e7erik yans\u0131t\u0131lan panel -->\n<app-panel>\n  <h2 panel-title>\u00d6zel Panel Ba\u015fl\u0131\u011f\u0131<\/h2>\n  <p>Bu \u00f6zel panelin i\u00e7eri\u011fi.<\/p>\n<\/app-panel>\n\n<!-- Hi\u00e7 i\u00e7erik yans\u0131t\u0131lmayan panel (varsay\u0131lanlar g\u00f6sterilir) -->\n<app-panel><\/app-panel>\n\n<!-- Sadece ba\u015fl\u0131k yans\u0131t\u0131lan panel (g\u00f6vde varsay\u0131lan\u0131 g\u00f6sterilir) -->\n<app-panel>\n  <h3 panel-title>Sadece Ba\u015fl\u0131k<\/h3>\n<\/app-panel><\/code><\/pre>\n<p>Bu \u00f6zellik, bile\u015fenlerinizi daha sa\u011flam ve kullan\u0131c\u0131 dostu hale getirir, \u00e7\u00fcnk\u00fc her zaman bir yedek i\u00e7eri\u011fin olmas\u0131n\u0131 garanti eder.<\/p>\n<h3>Ko\u015fullu \u0130\u00e7erik Yans\u0131tma<\/h3>\n<p>\u00dcst bile\u015fenden yans\u0131t\u0131lan i\u00e7eri\u011fi, alt bile\u015fen i\u00e7inde ko\u015fullu olarak g\u00f6stermek veya gizlemek isteyebilirsiniz. Bu, <\/code><em>ngIf<code>, <\/code><\/em>ngFor<code> gibi yap\u0131sal direktifleri <\/code>ng-content<code> etiketi \u00fczerinde kullanarak kolayca yap\u0131labilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ conditional-content.component.ts\nimport { Component, Input } from '@angular\/core';\n\n@Component({\n  selector: 'app-conditional-content',\n  template: <\/code>\n    <div class=\"wrapper\">\n      <div *ngIf=\"showHeader\">\n        <h3>Ba\u015fl\u0131k Var<\/h3>\n        <ng-content select=\"[header-content]\"><\/ng-content>\n      <\/div>\n      <div *ngIf=\"showBody\">\n        <p>G\u00f6vde \u0130\u00e7eri\u011fi:<\/p>\n        <ng-content><\/ng-content>\n      <\/div>\n      <div *ngIf=\"showFooter\">\n        <p>Alt Bilgi:<\/p>\n        <ng-content select=\"[footer-content]\"><\/ng-content>\n      <\/div>\n    <\/div>\n  <code>,\n  styles: [<\/code>\n    .wrapper { border: 1px solid teal; padding: 10px; margin: 10px; }\n  <code>]\n})\nexport class ConditionalContentComponent {\n  @Input() showHeader: boolean = true;\n  @Input() showBody: boolean = true;\n  @Input() showFooter: boolean = true;\n}<\/code><\/pre>\n<p>Kullan\u0131m\u0131:<\/p>\n<pre><code class=\"language-html\"><!-- app.component.html -->\n<app-conditional-content [showFooter]=\"false\">\n  <h4 header-content>Bu Ba\u015fl\u0131k Her Zaman G\u00f6r\u00fcn\u00fcr<\/h4>\n  <p>Bu g\u00f6vde i\u00e7eri\u011fi.<\/p>\n  <span footer-content>Bu alt bilgi asla g\u00f6r\u00fcnmez.<\/span>\n<\/app-conditional-content>\n\n<app-conditional-content [showHeader]=\"false\" [showBody]=\"false\">\n  <h4 header-content>Bu Ba\u015fl\u0131k Asla G\u00f6r\u00fcnmez<\/h4>\n  <p>Bu g\u00f6vde i\u00e7eri\u011fi de g\u00f6r\u00fcnmez.<\/p>\n  <span footer-content>Bu alt bilgi g\u00f6r\u00fcn\u00fcr.<\/span>\n<\/app-conditional-content><\/code><\/pre>\n<p>Bu, bile\u015feninizi daha dinamik hale getirir, \u00e7\u00fcnk\u00fc i\u00e7eri\u011fin varl\u0131\u011f\u0131na veya belirli ko\u015fullara ba\u011fl\u0131 olarak yans\u0131t\u0131lan i\u00e7eri\u011fi kontrol edebilirsiniz.<\/p>\n<h3>Yans\u0131t\u0131lan \u0130\u00e7eri\u011fe Eri\u015fme: <\/code>@ContentChild<code> ve <\/code>@ContentChildren<code> Dekor\u00f6t\u00f6rleri<\/h3>\n<p>Bazen alt bile\u015fenin, kendisine yans\u0131t\u0131lan i\u00e7eri\u011fi do\u011frudan sorgulamas\u0131 veya onunla etkile\u015fim kurmas\u0131 gerekebilir. \u00d6rne\u011fin, bir form bile\u015feni, kendisine yans\u0131t\u0131lan t\u00fcm form kontrol elemanlar\u0131n\u0131 bulup onlar\u0131 y\u00f6netmek isteyebilir. Angular, bu senaryolar i\u00e7in <\/code>@ContentChild<code> ve <\/code>@ContentChildren<code> dekorat\u00f6rlerini sa\u011flar. Bunlar, <\/code>@ViewChild<code> ve <\/code>@ViewChildren<code>'\u0131n yans\u0131t\u0131lan i\u00e7erik i\u00e7in olan kar\u015f\u0131l\u0131klar\u0131d\u0131r.<\/p>\n<p>*   <strong><\/code>@ContentChild<code>:<\/strong> Yans\u0131t\u0131lan i\u00e7erik i\u00e7indeki ilk e\u015fle\u015fen eleman\u0131 (bile\u015fen, direktif veya HTML eleman\u0131) sorgulamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong><\/code>@ContentChildren<code>:<\/strong> Yans\u0131t\u0131lan i\u00e7erik i\u00e7indeki t\u00fcm e\u015fle\u015fen elemanlar\u0131 sorgulamak i\u00e7in kullan\u0131l\u0131r ve bir <\/code>QueryList<code> d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p>Bu dekorat\u00f6rler, <\/code>AfterContentInit<code> ve <\/code>AfterContentChecked<code> ya\u015fam d\u00f6ng\u00fcs\u00fc hook'lar\u0131 ile birlikte kullan\u0131l\u0131r, \u00e7\u00fcnk\u00fc yans\u0131t\u0131lan i\u00e7erik, bile\u015fenin kendi view'\u0131 render edildikten sonra kullan\u0131ma haz\u0131r hale gelir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ form-group.component.ts\nimport { AfterContentInit, Component, ContentChild, QueryList, ContentChildren } from '@angular\/core';\nimport { NgModel } from '@angular\/forms'; \/\/ \u00d6rnek olarak NgModel'i sorgulayal\u0131m\n\n@Component({\n  selector: 'app-form-group',\n  template: <\/code>\n    <div class=\"form-group\">\n      <label>\n        <ng-content select=\"label\"><\/ng-content>\n      <\/label>\n      <div class=\"input-wrapper\">\n        <ng-content select=\"input, textarea, select\"><\/ng-content>\n      <\/div>\n      <div *ngIf=\"inputModel?.invalid &#038;&#038; inputModel?.touched\" class=\"error-message\">\n        L\u00fctfen ge\u00e7erli bir de\u011fer girin.\n      <\/div>\n      <div *ngIf=\"allInputs?.length > 1\">\n        Birden fazla input var!\n      <\/div>\n    <\/div>\n  <code>,\n  styles: [<\/code>\n    .form-group { margin-bottom: 15px; border: 1px solid #eee; padding: 10px; border-radius: 4px; }\n    .input-wrapper { margin-top: 5px; }\n    .error-message { color: red; font-size: 0.8em; margin-top: 5px; }\n  <code>]\n})\nexport class FormGroupComponent implements AfterContentInit {\n  \/\/ Yans\u0131t\u0131lan i\u00e7erikteki ilk NgModel \u00f6rne\u011fini yakala\n  @ContentChild(NgModel) inputModel!: NgModel;\n\n  \/\/ Yans\u0131t\u0131lan i\u00e7erikteki t\u00fcm input, textarea veya select elemanlar\u0131n\u0131 yakala\n  @ContentChildren(NgModel) allInputs!: QueryList<NgModel>;\n\n  ngAfterContentInit() {\n    if (this.inputModel) {\n      console.log('Yans\u0131t\u0131lan i\u00e7erikteki ilk NgModel:', this.inputModel);\n      \/\/ Bu NgModel \u00f6rne\u011fi \u00fczerinde i\u015flemler yapabiliriz, \u00f6rne\u011fin validasyon durumunu izleyebiliriz.\n      this.inputModel.valueChanges?.subscribe(value => {\n        console.log('Input de\u011feri de\u011fi\u015fti:', value);\n      });\n    }\n\n    if (this.allInputs) {\n      console.log('Yans\u0131t\u0131lan i\u00e7erikteki t\u00fcm NgModel\\'ler:', this.allInputs.length);\n      this.allInputs.changes.subscribe(() => {\n        console.log('NgModel listesi de\u011fi\u015fti, yeni say\u0131:', this.allInputs.length);\n      });\n    }\n  }\n}<\/code><\/pre>\n<p>Kullan\u0131m\u0131:<\/p>\n<pre><code class=\"language-html\"><!-- app.component.html -->\n<form #myForm=\"ngForm\">\n  <app-form-group>\n    <label>Ad\u0131n\u0131z:<\/label>\n    <input type=\"text\" name=\"name\" [(ngModel)]=\"userName\" required minlength=\"3\">\n  <\/app-form-group>\n\n  <app-form-group>\n    <label>E-posta:<\/label>\n    <input type=\"email\" name=\"email\" [(ngModel)]=\"userEmail\" required email>\n  <\/app-form-group>\n\n  <app-form-group>\n    <label>Mesaj\u0131n\u0131z:<\/label>\n    <textarea name=\"message\" [(ngModel)]=\"userMessage\"><\/textarea>\n  <\/app-form-group>\n<\/form><\/code><\/pre>\n<p>Bu \u00f6rnekte, <\/code>FormGroupComponent<code>, kendisine yans\u0131t\u0131lan <\/code><label><code> ve <\/code><input><code>\/<\/code><textarea><code> elemanlar\u0131n\u0131 kendi \u015fablonunda belirli yerlere yerle\u015ftirir. Ayr\u0131ca, <\/code>@ContentChild(NgModel)<code> kullanarak yans\u0131t\u0131lan <\/code>input<code> eleman\u0131n\u0131n <\/code>NgModel<code> \u00f6rne\u011fine eri\u015fir ve onun ge\u00e7erlilik durumunu izleyerek hata mesaj\u0131n\u0131 g\u00f6sterir. Bu, bile\u015fenlerin yans\u0131t\u0131lan i\u00e7eri\u011fi sadece render etmekle kalmay\u0131p, ayn\u0131 zamanda onunla programatik olarak etkile\u015fim kurmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>\u0130\u00e7erik Yans\u0131tma ve Performans<\/h2>\n<p>\u0130\u00e7erik yans\u0131tma, Angular uygulamalar\u0131n\u0131n esnekli\u011fini art\u0131rsa da, performans \u00fczerindeki etkileri g\u00f6z ard\u0131 edilmemelidir.<\/p>\n<h3>De\u011fi\u015fiklik Alg\u0131lama Mekanizmalar\u0131<\/h3>\n<p>Angular'\u0131n de\u011fi\u015fiklik alg\u0131lama mekanizmas\u0131, bir bile\u015fenin \u015fablonundaki veya veri \u00f6zelliklerindeki de\u011fi\u015fiklikleri alg\u0131layarak DOM'u g\u00fcnceller. \u0130\u00e7erik yans\u0131tma durumunda, yans\u0131t\u0131lan i\u00e7erik asl\u0131nda \u00fcst bile\u015fenin ba\u011flam\u0131nda de\u011ferlendirilir ve \u00fcst bile\u015fenin de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcne tabidir. Alt bile\u015fen, yans\u0131t\u0131lan i\u00e7eri\u011fi sadece bir yer tutucu olarak bar\u0131nd\u0131r\u0131r.<\/p>\n<p>Bu, \u015fu anlama gelir:<br \/>\n*   Yans\u0131t\u0131lan i\u00e7erikteki herhangi bir de\u011fi\u015fiklik, \u00fcst bile\u015fenin de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fc taraf\u0131ndan alg\u0131lan\u0131r.<br \/>\n*   Alt bile\u015fen, <\/code>OnPush<code> de\u011fi\u015fiklik alg\u0131lama stratejisi kullan\u0131yor olsa bile, yans\u0131t\u0131lan i\u00e7erik her zaman \u00fcst bile\u015fenin de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcn\u00fcn bir par\u00e7as\u0131 olarak kontrol edilir. Bu, <\/code>OnPush<code> stratejisinin yans\u0131t\u0131lan i\u00e7erik \u00fczerindeki etkinli\u011fini s\u0131n\u0131rlar. Ancak, alt bile\u015fenin kendi i\u00e7indeki verileri ve \u015fablonu, <\/code>OnPush<code> sayesinde daha verimli olabilir.<\/p>\n<h3>Performans \u0130pu\u00e7lar\u0131<\/h3>\n<p>*   <strong>Gereksiz \u0130\u00e7erik Yans\u0131tmadan Ka\u00e7\u0131n\u0131n:<\/strong> Yans\u0131t\u0131lan i\u00e7erik ne kadar karma\u015f\u0131k olursa, Angular'\u0131n de\u011fi\u015fiklikleri alg\u0131lamas\u0131 ve DOM'u g\u00fcncellemesi o kadar fazla zaman alabilir. Basit bile\u015fenler i\u00e7in i\u00e7erik yans\u0131tma idealdir, ancak \u00e7ok karma\u015f\u0131k ve s\u0131k g\u00fcncellenen i\u00e7erikler i\u00e7in alternatif yakla\u015f\u0131mlar (\u00f6rne\u011fin, <\/code>@Input<code> ile veri ge\u00e7irme) daha iyi olabilir.<br \/>\n*   <strong><\/code>OnPush<code> Stratejisini Do\u011fru Kullan\u0131n:<\/strong> Alt bile\u015feninizde <\/code>ChangeDetectionStrategy.OnPush<code> kullan\u0131yorsan\u0131z, yans\u0131t\u0131lan i\u00e7eri\u011fin \u00fcst bile\u015fenin de\u011fi\u015fiklik alg\u0131lama d\u00f6ng\u00fcs\u00fcne dahil olaca\u011f\u0131n\u0131 unutmay\u0131n. Ancak, alt bile\u015fenin kendi <\/code>Input<code> \u00f6zellikleri veya olaylar\u0131 tetiklenmedi\u011fi s\u00fcrece, alt bile\u015fenin kendi \u015fablonunun yeniden render edilmesini engelleyerek yine de performans kazan\u0131m\u0131 sa\u011flayabilirsiniz.<br \/>\n*   <strong><\/code>ng-container<code> ile DOM Y\u00fck\u00fcn\u00fc Azalt\u0131n:<\/strong> E\u011fer birden fazla eleman\u0131 gruplaman\u0131z gerekiyorsa ancak fazladan bir <\/code>div<code> etiketinin DOM'a eklenmesini istemiyorsan\u0131z, <\/code>ng-container<code> kullan\u0131n. Bu, DOM a\u011fac\u0131n\u0131 daha hafif tutar.<br \/>\n*   <strong><\/code>@ContentChildren<code> Kullan\u0131m\u0131na Dikkat Edin:<\/strong> <\/code>QueryList<code>'ler dinamiktir ve i\u00e7erik eklendi\u011finde veya kald\u0131r\u0131ld\u0131\u011f\u0131nda g\u00fcncellenir. B\u00fcy\u00fck listeler \u00fczerinde s\u0131k s\u0131k sorgulama yapmak veya <\/code>QueryList.changes<code>'\u0131 dinlemek, \u00f6zellikle performans kritik uygulamalarda dikkatle y\u00f6netilmelidir.<\/p>\n<p>Genel olarak, i\u00e7erik yans\u0131tma performans \u00fczerinde ciddi bir darbo\u011faz olu\u015fturmaz, ancak b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda, \u00f6zellikle \u00e7ok say\u0131da i\u00e7 i\u00e7e ge\u00e7mi\u015f bile\u015fen ve s\u0131k g\u00fcncellenen i\u00e7erik oldu\u011funda, bu konular\u0131 ak\u0131lda tutmak \u00f6nemlidir.<\/p>\n<h2>S\u0131k\u00e7a Yap\u0131lan Hatalar ve En \u0130yi Uygulamalar<\/h2>\n<p>\u0130\u00e7erik yans\u0131tma, Angular'da g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r, ancak yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda kafa kar\u0131\u015f\u0131kl\u0131\u011f\u0131na veya beklenmedik davran\u0131\u015flara yol a\u00e7abilir.<\/p>\n<h3>Hatalar<\/h3>\n<p>1.  <strong>Yanl\u0131\u015f <\/code>select<code> Kullan\u0131m\u0131:<\/strong> En yayg\u0131n hatalardan biri, <\/code>select<code> \u00f6zniteli\u011fini yanl\u0131\u015f se\u00e7iciyle kullanmakt\u0131r. \u00d6rne\u011fin, bir CSS s\u0131n\u0131f\u0131 se\u00e7mek yerine bir HTML etiketi se\u00e7mek veya tam tersi. Ayr\u0131ca, birden fazla <\/code>ng-content<code>'e ayn\u0131 <\/code>select<code> de\u011ferini vermek, Angular'\u0131n hangi slota i\u00e7eri\u011fi yerle\u015ftirece\u011fini bilememesine neden olabilir. Se\u00e7ilmeyen i\u00e7eriklerin kaybolmas\u0131 da s\u0131k kar\u015f\u0131la\u015f\u0131lan bir durumdur.<br \/>\n2.  <strong><\/code>ng-content<code>'i <\/code>ngTemplateOutlet<code> ile Kar\u0131\u015ft\u0131rmak:<\/strong> Daha \u00f6nce de detayland\u0131rd\u0131\u011f\u0131m\u0131z gibi, bu ikisi farkl\u0131 ama\u00e7lara hizmet eder. <\/code>ng-content<code> ger\u00e7ek DOM elemanlar\u0131n\u0131 yans\u0131t\u0131rken, <\/code>ngTemplateOutlet<code> bir \u015fablonu bir ba\u011flam ile render eder. Hangi senaryoda hangisinin kullan\u0131laca\u011f\u0131n\u0131 anlamamak, yanl\u0131\u015f mimari se\u00e7imlerine yol a\u00e7abilir.<br \/>\n3.  <strong>A\u015f\u0131r\u0131 Karma\u015f\u0131k \u0130\u00e7erik Yans\u0131tma:<\/strong> Bir bile\u015fenin \u00e7ok fazla <\/code>ng-content<code> slotu olmas\u0131 veya <\/code>select<code> \u00f6zniteli\u011finin \u00e7ok karma\u015f\u0131k se\u00e7iciler i\u00e7ermesi, bile\u015fenin anla\u015f\u0131lmas\u0131n\u0131 ve bak\u0131m\u0131n\u0131 zorla\u015ft\u0131r\u0131r. Bile\u015fenin API'si, yani hangi i\u00e7eri\u011fi bekledi\u011fi, net olmal\u0131d\u0131r.<br \/>\n4.  <strong>Yans\u0131t\u0131lan \u0130\u00e7eri\u011fin Ba\u011flam\u0131n\u0131 Yanl\u0131\u015f Anlamak:<\/strong> Yans\u0131t\u0131lan i\u00e7erik, onu \u00e7a\u011f\u0131ran \u00fcst bile\u015fenin ba\u011flam\u0131nda \u00e7al\u0131\u015f\u0131r. Bu, yans\u0131t\u0131lan i\u00e7erik i\u00e7indeki <\/code>(click)<code> olaylar\u0131n\u0131n veya <\/code>{{ data }}<code> ba\u011flamalar\u0131n\u0131n \u00fcst bile\u015fene ait oldu\u011fu anlam\u0131na gelir. Alt bile\u015fen i\u00e7inde yans\u0131t\u0131lan i\u00e7eri\u011fin kendi ba\u011flam\u0131na eri\u015fmeye \u00e7al\u0131\u015fmak hataya yol a\u00e7ar.<\/p>\n<h3>En \u0130yi Uygulamalar<\/h3>\n<p>1.  <strong>Net API Tasar\u0131m\u0131:<\/strong> Bile\u015fenlerinizin hangi i\u00e7erik slotlar\u0131n\u0131 bekledi\u011fini a\u00e7\u0131k\u00e7a belirtin. <\/code>select<code> de\u011ferleri a\u00e7\u0131klay\u0131c\u0131 olmal\u0131 ve bile\u015fenin ne bekledi\u011fini yans\u0131tmal\u0131d\u0131r (\u00f6rne\u011fin, <\/code>select=&#8221;[card-header]&#8221;<code> yerine <\/code>select=&#8221;[header]&#8221;<code> gibi daha genel ifadelerden ka\u00e7\u0131n\u0131n, e\u011fer header'\u0131n bir kart\u0131n header'\u0131 oldu\u011funu vurgulamak istiyorsan\u0131z).<br \/>\n2.  <strong>Varsay\u0131lan \u0130\u00e7erik Kullan\u0131m\u0131:<\/strong> M\u00fcmk\u00fcn oldu\u011funda, <\/code>ng-content<code> slotlar\u0131 i\u00e7in varsay\u0131lan i\u00e7erik sa\u011flay\u0131n. Bu, bile\u015feninizi daha sa\u011flam hale getirir ve kullan\u0131c\u0131lar\u0131n i\u00e7eri\u011fi sa\u011flamay\u0131 unuttu\u011fu durumlarda bo\u015f bir alan g\u00f6rmek yerine bir yedek mesaj veya yap\u0131 g\u00f6rmesini sa\u011flar.<br \/>\n3.  <strong>Dok\u00fcmantasyon:<\/strong> Bile\u015fenlerinizi kullanacak di\u011fer geli\u015ftiriciler i\u00e7in, hangi <\/code>ng-content<code> slotlar\u0131n\u0131n mevcut oldu\u011funu ve hangi <\/code>select<code> de\u011ferlerini bekledi\u011fini a\u00e7\u0131k\u00e7a belgeleyin. Storybook gibi ara\u00e7lar bu konuda \u00e7ok yard\u0131mc\u0131 olabilir.<br \/>\n4.  <strong>Mod\u00fclerlik ve Sadelik:<\/strong> \u0130\u00e7erik yans\u0131tmay\u0131, bile\u015fenlerinizi daha mod\u00fcler ve yeniden kullan\u0131labilir hale getirmek i\u00e7in kullan\u0131n, ancak a\u015f\u0131r\u0131ya ka\u00e7may\u0131n. E\u011fer bir bile\u015fen \u00e7ok fazla <\/code>ng-content<code> slotuna ihtiya\u00e7 duyuyorsa, belki de bu bile\u015feni daha k\u00fc\u00e7\u00fck, daha odaklanm\u0131\u015f alt bile\u015fenlere ay\u0131rman\u0131z gerekebilir.<br \/>\n5.  <strong><\/code>ng-container<code> ile Gereksiz DOM D\u00fc\u011f\u00fcmlerinden Ka\u00e7\u0131n\u0131n:<\/strong> E\u011fer sadece birden fazla eleman\u0131 gruplamak ve onlara bir <\/code>select<code> de\u011feri atamak istiyorsan\u0131z, ancak DOM'a ekstra bir <\/code>div<code> eklemek istemiyorsan\u0131z, <\/code>ng-container<code> kullan\u0131n.<br \/>\n6.  <strong><\/code>@ContentChild<code> ve <\/code>@ContentChildren<code>'\u0131 Dikkatli Kullan\u0131n:<\/strong> Bu dekorat\u00f6rler g\u00fc\u00e7l\u00fcd\u00fcr, ancak bile\u015fenler aras\u0131nda s\u0131k\u0131 bir ba\u011f\u0131ml\u0131l\u0131k yaratabilir. Yans\u0131t\u0131lan i\u00e7eri\u011fin i\u00e7 detaylar\u0131na \u00e7ok fazla ba\u011f\u0131ml\u0131 olmak, gelecekteki de\u011fi\u015fiklikleri zorla\u015ft\u0131rabilir. M\u00fcmk\u00fcnse, yans\u0131t\u0131lan i\u00e7eri\u011fin kendisinin olaylar yayarak veya <\/code>Input<code>'lar arac\u0131l\u0131\u011f\u0131yla \u00fcst bile\u015fenle ileti\u015fim kurmas\u0131n\u0131 tercih edin.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Angular'da i\u00e7erik yans\u0131tma, <\/code>ng-content<code> direktifi sayesinde bile\u015fen tabanl\u0131 mimarinin en g\u00fc\u00e7l\u00fc ve esnek \u00f6zelliklerinden biridir. Bu mekanizma, bile\u015fenlerinizi daha genel ama\u00e7l\u0131, yeniden kullan\u0131labilir ve \u00f6zelle\u015ftirilebilir hale getirerek, UI geli\u015ftirme s\u00fcrecini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r ve basitle\u015ftirir. Tekli veya \u00e7oklu slotlar i\u00e7in <\/code>select<code> \u00f6zniteli\u011fi ile esneklik sa\u011flarken, varsay\u0131lan i\u00e7erik ve ko\u015fullu render etme gibi \u00f6zelliklerle bile\u015fenlerinizi daha sa\u011flam yapabilirsiniz.<\/p>\n<p><\/code>@ContentChild<code> ve <\/code>@ContentChildren<code> gibi dekorat\u00f6rler, yans\u0131t\u0131lan i\u00e7erikle programatik olarak etkile\u015fim kurma yetene\u011fi sunarken, <\/code>ngTemplateOutlet` ile olan fark\u0131 anlamak, do\u011fru arac\u0131 do\u011fru senaryoda kullanmak i\u00e7in kritik \u00f6neme sahiptir. Performans etkilerini g\u00f6z \u00f6n\u00fcnde bulundurarak ve en iyi uygulamalar\u0131 takip ederek, Angular uygulamalar\u0131n\u0131zda i\u00e7erik yans\u0131tman\u0131n t\u00fcm avantajlar\u0131ndan faydalanabilirsiniz.<\/p>\n<p>Bu makalede ele al\u0131nan kavramlar, Angular geli\u015ftiricilerinin daha esnek, s\u00fcrd\u00fcr\u00fclebilir ve performansl\u0131 uygulamalar olu\u015fturmalar\u0131 i\u00e7in sa\u011flam bir temel sunmaktad\u0131r. \u0130\u00e7erik yans\u0131tmay\u0131 ustaca kullanarak, bile\u015fen k\u00fct\u00fcphanelerinizi zenginle\u015ftirebilir ve kullan\u0131c\u0131 aray\u00fczlerinizi daha dinamik hale getirebilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Angular&#8217;da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection)\nAngular, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir framewor","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-33014","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-angular","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Angular&#039;da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular&#039;da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection)\" \/>\n<meta property=\"og:description\" content=\"Angular&#039;da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection) Angular, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir framewor\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-28T09:41:25+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=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Angular&#8217;da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection)\",\"datePublished\":\"2025-10-28T09:41:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/\"},\"wordCount\":648,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Angular\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/\",\"name\":\"Angular'da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-28T09:41:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular&#8217;da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Angular'da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/","og_locale":"tr_TR","og_type":"article","og_title":"Angular'da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection)","og_description":"Angular'da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection) Angular, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir framewor","og_url":"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-28T09:41:25+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Angular&#8217;da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection)","datePublished":"2025-10-28T09:41:25+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/"},"wordCount":648,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Angular"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/","url":"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/","name":"Angular'da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-28T09:41:25+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/angularda-ng-content-ile-icerik-yansitma-content-projection\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular&#8217;da ng-content ile \u0130\u00e7erik Yans\u0131tma (Content Projection)"}]},{"@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\/33014","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=33014"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33014\/revisions"}],"predecessor-version":[{"id":33015,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33014\/revisions\/33015"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}