﻿
{"id":25909,"date":"2022-12-06T18:54:09","date_gmt":"2022-12-06T18:54:09","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=25909"},"modified":"2022-12-06T18:54:09","modified_gmt":"2022-12-06T18:54:09","slug":"angular-gelismis-component-yapilanmasi-viewchild-viewchildren-querylist","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/angular-gelismis-component-yapilanmasi-viewchild-viewchildren-querylist\/","title":{"rendered":"Angular &#8211; Geli\u015fmi\u015f Component Yap\u0131lanmas\u0131 | ViewChild, ViewChildren, QueryList"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde Angular mimarisinde, DOM nesnelerine kar\u015f\u0131l\u0131k referans olu\u015fturmak i\u00e7in kullan\u0131lan <em>ViewChild<\/em> ve <em>ViewChildren<\/em> dekorat\u00f6rleriyle birlikte bu nesneleri koleksiyonel olarak elde etmemizi sa\u011flayan <em>QueryList<\/em> decorat\u00f6r\u00fcn\u00fcn i\u015flevlerini inceliyor olaca\u011f\u0131z.<\/p>\n<h4>ViewChild<\/h4>\n<p>ViewChild dekorat\u00f6r\u00fc, DOM&#8217;da ilk e\u015fle\u015fti\u011fi \u00f6\u011feyi temsil etmektedir. \u015e\u00f6yle ki;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular\/core';\r\n\r\n@Component({\r\n  selector: 'app-home',\r\n  template: `\r\n  &lt;input type=&quot;text&quot; value=&quot;Merhaba&quot; #txtInput&gt;\r\n  `\r\n})\r\nexport class HomeComponent implements AfterViewInit {\r\n\r\n  @ViewChild(&quot;txtInput&quot;, { static: false }) txtInput: ElementRef;\r\n\r\n  ngAfterViewInit(): void {\r\n    console.log(this.txtInput)\r\n    const htmlInputElement: HTMLInputElement = this.txtInput.nativeElement;\r\n    console.log(htmlInputElement.value)\r\n  }\r\n\r\n}\r\n<\/pre>\n<\/div>\n<p>Dikkat ederseniz &#8216;input&#8217; HTML element&#8217;ine &#8216;#txtInput&#8217; template variable&#8217;\u0131n\u0131 atayarak i\u015faretliyoruz ve ard\u0131ndan <code>ViewChild<\/code> dekorat\u00f6r\u00fc ile ilgili de\u011fi\u015fkeni sorgulayarak yakal\u0131yoruz. Tabi burada yakalanan HTML nesnesinin <code>ElementRef<\/code> t\u00fcr\u00fcnden elde edildi\u011fini ve i\u00e7erisindeki &#8216;nativeElement&#8217; property&#8217;sinin ise art\u0131k nesnenin \u00f6zelli\u011fine g\u00f6re (<code>HTMLInputElement<\/code>) \u015fekillendi\u011fini bilmenizde fayda vard\u0131r.<\/p>\n<p>Ayn\u0131 \u015fekilde &#8216;ViewChild&#8217; dekorat\u00f6r\u00fc ile selector \u00fczerinden kullan\u0131lan component&#8217;ler de i\u015faretlenebilmekte ve kullan\u0131labilmektedir. Bunun i\u00e7in de a\u015fa\u011f\u0131daki \u00f6rne\u011fi inceleyebiliriz;<\/p>\n<p>Child Component:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component } from '@angular\/core';\r\n\r\n@Component({\r\n  selector: 'app-child',\r\n  template: `\r\n  &lt;h4&gt;Child Component&lt;\/h4&gt;\r\n  Ge\u00e7erli say\u0131 : {{count}}\r\n  `\r\n})\r\nexport class ChildComponent {\r\n\r\n  count = 0;\r\n\r\n  increment() {\r\n    this.count++;\r\n  }\r\n\r\n  decrement() {\r\n    this.count--;\r\n  }\r\n\r\n}\r\n<\/pre>\n<\/div>\n<p>Home Component:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular\/core';\r\nimport { ChildComponent } from '..\/child\/child.component';\r\n\r\n@Component({\r\n  selector: 'app-home',\r\n  template: `\r\n  &lt;button (click)=&quot;increment()&quot;&gt;Increment&lt;\/button&gt;\r\n  &lt;button (click)=&quot;decrement()&quot;&gt;Decrement&lt;\/button&gt;\r\n  &lt;p&gt;Ge\u00e7erli say\u0131 : {{childComponent.count}}&lt;\/p&gt;\r\n  &lt;app-child&gt;&lt;\/app-child&gt;\r\n  `\r\n})\r\nexport class HomeComponent {\r\n\r\n  @ViewChild(ChildComponent, { static: true }) childComponent: ChildComponent;\r\n\r\n  increment() {\r\n    this.childComponent.increment();\r\n  }\r\n\r\n  decrement() {\r\n    this.childComponent.decrement();\r\n  }\r\n\r\n}\r\n\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer, <code>ViewChild<\/code> dekorat\u00f6r\u00fc parametreye verilen &#8216;ChildComponent&#8217; t\u00fcr\u00fcn\u00fc direkt yakalamakta ve i\u00e7erisindeki \u00f6zellikleri kullan\u0131labilir k\u0131lmaktad\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList.gif\" alt=\"Angular - Geli\u015fmi\u015f Component Yap\u0131lanmas\u0131 | ViewChild, ViewChildren, QueryList\" width=\"200\" height=\"146\" class=\"aligncenter size-full wp-image-25913\" \/><\/a><br \/>\nYa da isterseniz \u00f6nceki \u00f6rnekte oldu\u011fu gibi template variable \u00fczerinden de i\u015faretlemede bulunup ard\u0131ndan ViewChild ile referans edebilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular\/core';\r\nimport { ChildComponent } from '..\/child\/child.component';\r\n\r\n@Component({\r\n  selector: 'app-home',\r\n  template: `\r\n  &lt;button (click)=&quot;increment()&quot;&gt;Increment&lt;\/button&gt;\r\n  &lt;button (click)=&quot;decrement()&quot;&gt;Decrement&lt;\/button&gt;\r\n  &lt;p&gt;Ge\u00e7erli say\u0131 : {{childComponent.count}}&lt;\/p&gt;\r\n  &lt;app-child #childComponent&gt;&lt;\/app-child&gt;\r\n  `\r\n})\r\nexport class HomeComponent {\r\n\r\n  @ViewChild(&quot;childComponent&quot;, { static: true }) childComponent: ChildComponent;\r\n\r\n  increment() {\r\n    this.childComponent.increment();\r\n  }\r\n\r\n  decrement() {\r\n    this.childComponent.decrement();\r\n  }\r\n\r\n}\r\n\r\n<\/pre>\n<\/div>\n<h4>ViewChild <code>static<\/code> Parametresi<\/h4>\n<p>Yukar\u0131da vermi\u015f oldu\u011fumuz \u00f6rneklerin kimin de <em>false<\/em> kimin de ise <em>true<\/em> olarak set etti\u011fimiz <code>static<\/code> parametresinin ne i\u015fe yarad\u0131\u011f\u0131n\u0131 muhtemelen merak etmi\u015fsinizdir. O halde hemen a\u00e7\u0131klayal\u0131m&#8230;<\/p>\n<p><code>static<\/code> parametresi, ViewChild ile referans edilen nesnenin sayfan\u0131n initialize edildi\u011fi andan beri mevcut olup olmad\u0131\u011f\u0131n\u0131 ifade eder. Bu parametreye <em>false<\/em> de\u011feri verildi\u011fi taktide Angular&#8217;\u0131n ilgili nesneyi sayfan\u0131n y\u00fcklenmesinden sonra arayaca\u011f\u0131n\u0131 yani bir ba\u015fka deyi\u015fle belirli ko\u015fullara g\u00f6re ba\u011f\u0131ml\u0131 olaca\u011f\u0131n\u0131 ifade etmi\u015f oluyoruz. Bu durumda da ilgili nesneyi ancak <code>ngAfterViewInit<\/code> event&#8217;in de elde edebiliyoruz. Yok e\u011fer <em>true<\/em> de\u011ferini verirseniz bu sefer de ilgili nesnenin sayfan\u0131n y\u00fcklenmesinin en ba\u015f\u0131ndan beri mevcut oldu\u011funu s\u00f6ylemi\u015f oluyoruz. Haliyle <code>ngOnInit<\/code> event&#8217;i \u00fczerinden eri\u015fim g\u00f6sterebiliyoruz.<\/p>\n<p>\u015e\u00f6yle ki;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nexport class HomeComponent implements OnInit, AfterViewInit {\r\n  @ViewChild(&quot;childComponent&quot;, { static: true }) childComponent: ChildComponent;\r\n\r\n  .\r\n  .\r\n  .\r\n\r\n  ngOnInit(): void {\r\n    console.log(&quot;OnInit&quot;, this.childComponent)\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    console.log(&quot;AfterViewInit&quot;, this.childComponent)\r\n  }\r\n\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki gibi <code>static<\/code> parametresini <em>true<\/em> ve <em>false<\/em> de\u011ferleriyle test edersek e\u011fer ilgili event&#8217;lerin eri\u015fim durumunu a\u015fa\u011f\u0131daki g\u00f6rsellerden g\u00f6zlemleyebiliriz.<\/p>\n<table>\n<thead>\n<tr>\n<th>true<\/th>\n<th>false<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList.png\" alt=\"Angular - Geli\u015fmi\u015f Component Yap\u0131lanmas\u0131 | ViewChild, ViewChildren, QueryList\" width=\"429\" height=\"46\" class=\"aligncenter size-full wp-image-25917\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList.png 429w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-300x32.png 300w\" sizes=\"auto, (max-width: 429px) 100vw, 429px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-1.png\" alt=\"Angular - Geli\u015fmi\u015f Component Yap\u0131lanmas\u0131 | ViewChild, ViewChildren, QueryList\" width=\"431\" height=\"41\" class=\"aligncenter size-full wp-image-25918\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-1.png 431w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-1-300x29.png 300w\" sizes=\"auto, (max-width: 431px) 100vw, 431px\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5>ViewChild &#8211; Multiple Instance<\/h5>\n<p>ViewChild ile referans etmek istedi\u011fimiz HTML yahut component farketmeksizin herhangi bir \u00f6\u011fenin sayfa \u00fczerinde birden fazla instance&#8217;\u0131 varsa e\u011fer bu durumda ilk nesne i\u015faretlenecektir.<\/p>\n<p>\u015e\u00f6yle ki;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n  template: `\r\n  &lt;button (click)=&quot;increment()&quot;&gt;Increment&lt;\/button&gt;\r\n  &lt;button (click)=&quot;decrement()&quot;&gt;Decrement&lt;\/button&gt;\r\n  &lt;p&gt;Ge\u00e7erli say\u0131 : {{childComponent.count}}&lt;\/p&gt;\r\n  &lt;app-child #childComponent&gt;&lt;\/app-child&gt;\r\n  &lt;app-child #childComponent&gt;&lt;\/app-child&gt;\r\n  `\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki \u00f6rnekte birden fazla &#8216;childComponent&#8217; template variable&#8217;a kar\u015f\u0131l\u0131k gelen &#8216;ChildComponent&#8217; tan\u0131mlamas\u0131 bulunmaktad\u0131r. \u00d6nceki sat\u0131rlarda &#8216;ViewChild&#8217; ile sadece ilk component&#8217;in referans edilece\u011fi s\u00f6ylendi\u011fi \u00fczere bu \u00e7al\u0131\u015fma neticesinde a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcndeki gibi bir davran\u0131\u015f s\u00f6z konusu olacakt\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-1.gif\" alt=\"Angular - Geli\u015fmi\u015f Component Yap\u0131lanmas\u0131 | ViewChild, ViewChildren, QueryList\" width=\"276\" height=\"248\" class=\"aligncenter size-full wp-image-25920\" \/><\/a><\/p>\n<h5>ViewChild &#8211; Read Option<\/h5>\n<p>ViewChild ile referans edilen \u00f6\u011feler birden fazla t\u00fcrle ili\u015fkilendirilerek daha efektif bir \u015fekilde y\u00f6netilebilmektedir. \u015e\u00f6yle ki;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@Component({\r\n  selector: 'app-home',\r\n  template: `\r\n  &lt;input type=&quot;text&quot; #txtInput &#x5B;(ngModel)]=&quot;txt&quot;&gt;\r\n  `\r\n})\r\nexport class HomeComponent implements OnInit {\r\n  @ViewChild(&quot;txtInput&quot;, { static: true, read: ElementRef }) txtInput: ElementRef;\r\n\r\n  txt: string;\r\n  .\r\n  .\r\n  .\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131da \u00f6rnek ama\u00e7l\u0131 tan\u0131mlanm\u0131\u015f olan input nesnesi &#8216;#txtInput&#8217; template variable&#8217;\u0131 ile i\u015faretlendi\u011fi gibi biryandan da <code>[(ngModel)]<\/code> direktifini kullanarak two way data binding \u00f6zelli\u011fini kullanmaktad\u0131r. Yani bizler bu nesneyi bir element oldu\u011fu i\u00e7in <code>ElementRef<\/code> ile, <code>[(ngModel)]<\/code>&#8216;\u0131 kulland\u0131\u011f\u0131 i\u00e7in <code>NgModel<\/code> ile veya bir view container oldu\u011fu i\u00e7in de <code>ViewContainerRef<\/code> t\u00fcr\u00fcyle ili\u015fkilendirerek referans edebiliriz. E\u011fer ki bu nesneyi a\u015fa\u011f\u0131daki gibi direkt ViewChild ile referans edersek default olarak <code>ElementRef<\/code> t\u00fcr\u00fcnden elde ediyor olaca\u011f\u0131z.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n @ViewChild(&quot;txtInput&quot;, { static: true }) txtInput;\r\n<\/pre>\n<\/div>\n<p>E\u011fer ilgili objeyi farkl\u0131 t\u00fcrlerle elde etmek istiyorsan\u0131z a\u015fa\u011f\u0131daki gibi <code>read<\/code> parametresini kullanarak bu i\u015flemi ger\u00e7ekle\u015ftirebilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n  @ViewChild(&quot;txtInput&quot;, { static: true, read: ElementRef }) txtInput: ElementRef;\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n  @ViewChild(&quot;txtInput&quot;, { static: true, read: NgModel }) txtInput: NgModel;\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n  @ViewChild(&quot;txtInput&quot;, { static: true, read: ViewContainerRef }) txtInput: ViewContainerRef;\r\n<\/pre>\n<\/div>\n<p>Angular&#8217;da her \u00f6\u011fenin <code>ElementRef<\/code> ve <code>ViewContainerRef<\/code> ile ili\u015fkilendirilebildi\u011fini ve e\u011fer ilgili \u00f6\u011fe bir direktif yahut component ise o t\u00fcrlerle de referans edilebildi\u011fini bilmenizde fayda vard\u0131r.<\/p>\n<p><code>read<\/code> parametresinin bir di\u011fer i\u015flevi ise child component&#8217;ten bir provider&#8217;\u0131 inject etmemizi sa\u011flamas\u0131d\u0131r. Hemen \u00f6rneklendirmemiz gerekirse e\u011fer;<\/p>\n<p>Child Component:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component } from '@angular\/core';\r\n\r\n@Component({\r\n  selector: 'app-child',\r\n  template: `\r\n  &lt;h4&gt;Child Component&lt;\/h4&gt;\r\n  `,\r\n  providers: &#x5B;{ provide: 'Example Provider', useValue: 'Example Value' }]\r\n})\r\nexport class ChildComponent {\r\n\r\n}\r\n<\/pre>\n<\/div>\n<p>Bak\u0131n, g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere child component&#8217;te &#8216;Example Provider&#8217; isminde bir provider tan\u0131mlanm\u0131\u015ft\u0131r.<\/p>\n<p>Home Component:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component, OnInit, ViewChild } from '@angular\/core';\r\n\r\n@Component({\r\n  selector: 'app-home',\r\n  template: `\r\n  &lt;app-child #child&gt;&lt;\/app-child&gt;\r\n  `\r\n})\r\nexport class HomeComponent implements OnInit {\r\n  @ViewChild(&quot;child&quot;, { static: true, read: 'Example Provider' }) exampleProvider: string;\r\n\r\n  txt: string;\r\n\r\n  ngOnInit(): void {\r\n    console.log(&quot;OnInit&quot;, this.exampleProvider)\r\n  }\r\n}\r\n<\/pre>\n<\/div>\n<p>Home component&#8217;te ise <code>ViewChild<\/code> ile &#8216;child&#8217; referans edilmekte lakin <code>read<\/code> de\u011ferine child component&#8217;te ki provider&#8217;\u0131n ad\u0131 verilerek esas\u0131nda bu provider&#8217;\u0131n de\u011feri elde edilmi\u015f olunmaktad\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-2.png\" alt=\"Angular - Geli\u015fmi\u015f Component Yap\u0131lanmas\u0131 | ViewChild, ViewChildren, QueryList\" width=\"155\" height=\"20\" class=\"aligncenter size-full wp-image-25922\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-2.png 155w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-2-150x20.png 150w\" sizes=\"auto, (max-width: 155px) 100vw, 155px\" \/><\/a><\/p>\n<h4>ViewChildren<\/h4>\n<p>ViewChild, sayfada ilgili \u00f6\u011feden ka\u00e7 tane olursa olsun e\u015fle\u015fecek olan ilk nesneyi, tek olarak referans etmektedir. ViewChildren ise verilen \u00f6\u011fenin t\u00fcm\u00fcn\u00fc <code>QueryList<\/code> olarak elde etmemizi sa\u011flayan bir dekorat\u00f6rd\u00fcr.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { AfterViewInit, Component, ElementRef, OnInit, QueryList, ViewChild, ViewChildren } from '@angular\/core';\r\n\r\n@Component({\r\n  selector: 'app-home',\r\n  template: `\r\n  &lt;app-child #child&gt;&lt;\/app-child&gt;\r\n  &lt;app-child #child&gt;&lt;\/app-child&gt;\r\n  &lt;app-child #child&gt;&lt;\/app-child&gt;\r\n  &lt;app-child #child&gt;&lt;\/app-child&gt;\r\n  `\r\n})\r\nexport class HomeComponent implements AfterViewInit {\r\n  @ViewChildren(&quot;child&quot;) childs: QueryList&lt;ElementRef&gt;;\r\n\r\n  ngAfterViewInit(): void {\r\n    console.log(&quot;AfterViewInit&quot;, this.childs)\r\n  }\r\n}\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-3.png\" alt=\"Angular - Geli\u015fmi\u015f Component Yap\u0131lanmas\u0131 | ViewChild, ViewChildren, QueryList\" width=\"399\" height=\"278\" class=\"aligncenter size-full wp-image-25924\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-3.png 399w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-3-300x209.png 300w\" sizes=\"auto, (max-width: 399px) 100vw, 399px\" \/><\/a>ViewChildren, syntax&#8217;\u0131 gere\u011fi <code>static<\/code> parametresi bar\u0131nd\u0131rmad\u0131\u011f\u0131 i\u00e7in referans etti\u011fi \u00f6\u011felere <code>ngOnInit<\/code> event&#8217;i i\u00e7erisinden eri\u015filememekte, sadece <code>ngAfterViewInit<\/code> event&#8217;inden eri\u015filebilmektedir.<\/p>\n<h5>ViewChildren &#8211; Read Option<\/h5>\n<p>Nas\u0131l ki ViewChild dekorat\u00f6r\u00fcnde <code>read<\/code> option&#8217;\u0131 child component&#8217;in provider&#8217;\u0131n\u0131 inject etmemizi sa\u011flamakta, benzer mant\u0131kla ViewChildren dekorat\u00f6r\u00fc de child component&#8217;lerin provider&#8217;lar\u0131n\u0131 inject ederek k\u00fcm\u00fclatif olarak elde etmemize imkan tan\u0131maktad\u0131r. Bunun i\u00e7in a\u015fa\u011f\u0131daki \u00f6rne\u011fi incelersek e\u011fer;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component } from '@angular\/core';\r\n\r\n@Component({\r\n  selector: 'app-child',\r\n  template: `\r\n  &lt;h4&gt;Child Component&lt;\/h4&gt;\r\n  `,\r\n  providers: &#x5B;{ provide: 'Example Provider', useValue: 'Example Value - Child' }]\r\n})\r\nexport class ChildComponent {\r\n\r\n}\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@Component({\r\n  selector: 'app-child2',\r\n  template: ``,\r\n  providers: &#x5B;{ provide: 'Example Provider', useValue: 'Example Value - Child 2' }]\r\n})\r\nexport class Child2Component {\r\n\r\n}\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@Component({\r\n  selector: 'app-child3',\r\n  template: ``,\r\n  providers: &#x5B;{ provide: 'Example Provider', useValue: 'Example Value - Child 3' }]\r\n})\r\nexport class Child3Component {\r\n\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;Child&#8217;, &#8216;Child2&#8217; ve &#8216;Child3&#8217; component&#8217;leri tan\u0131mlanm\u0131\u015f ve her component&#8217;te farkl\u0131 value&#8217;lara kar\u015f\u0131l\u0131k gelen &#8216;Example Provider&#8217; key&#8217;inde provider olu\u015fturulmu\u015ftur. \u015eimdi bu provider&#8217;lar\u0131 a\u015fa\u011f\u0131daki gibi ayn\u0131 template variable ile i\u015faretleyerek <code>ViewChildren<\/code> dekorat\u00f6r\u00fcyle QueryList olarak elde edebilir ve <code>read<\/code> option&#8217;\u0131 ile de hepsinin provider de\u011ferlerini okuyarak elde edebiliriz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { AfterViewInit, Component, ElementRef, QueryList, ViewChildren } from '@angular\/core';\r\n\r\n@Component({\r\n  selector: 'app-home',\r\n  template: `\r\n  &lt;app-child #child&gt;&lt;\/app-child&gt;\r\n  &lt;app-child2 #child&gt;&lt;\/app-child2&gt;\r\n  &lt;app-child3 #child&gt;&lt;\/app-child3&gt;\r\n  `\r\n})\r\nexport class HomeComponent implements AfterViewInit {\r\n  @ViewChildren(&quot;child&quot;, { read: &quot;Example Provider&quot; }) childs: QueryList&lt;ElementRef&gt;;\r\n\r\n  ngAfterViewInit(): void {\r\n    console.log(&quot;AfterViewInit&quot;, this.childs)\r\n  }\r\n}\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-4.png\" alt=\"Angular - Geli\u015fmi\u015f Component Yap\u0131lanmas\u0131 | ViewChild, ViewChildren, QueryList\" width=\"364\" height=\"232\" class=\"aligncenter size-full wp-image-25927\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-4.png 364w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-4-300x191.png 300w\" sizes=\"auto, (max-width: 364px) 100vw, 364px\" \/><\/a><\/p>\n<h4>QueryList<\/h4>\n<p>ViewChildren dekorat\u00f6r\u00fc neticesinde QueryList t\u00fcr\u00fcnden elde edilen \u00f6\u011felerin sayfaya eklenip kald\u0131r\u0131ld\u0131\u011f\u0131na dair bilgi edinebilmek i\u00e7in <code>changes<\/code> property&#8217;sine subscribe olarak s\u00fcreci takipte bulunabiliriz.<\/p>\n<p>Misal olarak <code>ngIf<\/code> direktifiyle ilgili \u00f6\u011felerin visible \u00f6zelli\u011fine a\u015fa\u011f\u0131daki gibi kontrol getirebilir ve her de\u011fi\u015fiklik durumunda tetiklenecek olan <code>changes<\/code> property&#8217;sinden \u00f6\u011felerin son durumuna dair bilgi alabiliriz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { AfterViewInit, Component, ElementRef, QueryList, ViewChildren } from '@angular\/core';\r\n\r\n@Component({\r\n  selector: 'app-home',\r\n  template: `\r\n  &lt;h1 #element&gt;A&lt;\/h1&gt;\r\n  &lt;h1 *ngIf=&quot;visible&quot; #element&gt;B&lt;\/h1&gt;\r\n  &lt;h1 *ngIf=&quot;visible&quot; #element&gt;C&lt;\/h1&gt;\r\n\r\n  &lt;button (click)=&quot;visibleComponents()&quot;&gt;Show&lt;\/button&gt;\r\n  `\r\n})\r\nexport class HomeComponent implements AfterViewInit {\r\n  @ViewChildren(&quot;element&quot;, {}) childs: QueryList&lt;ElementRef&gt;;\r\n\r\n  visible: boolean;\r\n\r\n  ngAfterViewInit(): void {\r\n    console.log(&quot;AfterViewInit&quot;, this.childs)\r\n    this.childs.changes.subscribe({\r\n      next: (data) =&gt; {\r\n        console.log(data)\r\n      }\r\n    });\r\n  }\r\n\r\n  visibleComponents() {\r\n    this.visible = !this.visible;\r\n  }\r\n}\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-2.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-2.gif\" alt=\"Angular - Geli\u015fmi\u015f Component Yap\u0131lanmas\u0131 | ViewChild, ViewChildren, QueryList\" width=\"680\" height=\"656\" class=\"aligncenter size-full wp-image-25930\" \/><\/a><\/p>\n<h4>Directive \u0130le \u0130\u015faretlenmi\u015f \u00d6\u011feleri Elde Etme<\/h4>\n<p>Son olarak, herhangi bir direktif ile i\u015faretledi\u011fimiz \u00f6\u011feleri &#8216;ViewChild&#8217; ile nas\u0131l elde edebilece\u011fimizi konu\u015fmakta fayda g\u00f6rmekteyim. Bunun i\u00e7in a\u015fa\u011f\u0131daki \u00f6rnek \u00e7al\u0131\u015fmay\u0131 inceleyebilirsiniz.<\/p>\n<p>Custom Directive:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Directive, ElementRef } from '@angular\/core';\r\n\r\n@Directive({\r\n  selector: '&#x5B;appEx]'\r\n})\r\nexport class ExDirective {\r\n\r\n  constructor(public elementRef: ElementRef) { }\r\n\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki custom directive kodlar\u0131n\u0131 incelerseniz e\u011fer i\u015faretleyece\u011fi HTML \u00f6\u011fesini kar\u015f\u0131layabilmesi i\u00e7in access modifier&#8217;\u0131 &#8216;public&#8217; ve t\u00fcr\u00fc &#8216;ElementRef&#8217; olan bir parametre bar\u0131nd\u0131rmaktad\u0131r.<\/p>\n<p>\u015eimdi bu directive ile &#8216;ViewChild&#8217;\u0131 birlikte a\u015fa\u011f\u0131daki gibi kullanabiliriz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component, ElementRef, OnInit, ViewChild } from '@angular\/core';\r\nimport { ExDirective } from '..\/ex.directive';\r\n\r\n@Component({\r\n  selector: 'app-home',\r\n  template: `\r\n  &lt;h1 appEx&gt;...&lt;\/h1&gt;\r\n  `\r\n})\r\nexport class HomeComponent implements OnInit {\r\n  @ViewChild(ExDirective, { static: true }) ex: ExDirective;\r\n\r\n  ngOnInit(): void {\r\n    console.log(this.ex.elementRef)\r\n  }\r\n}\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/Angular-Gelismis-Component-Yapilanmasi-ViewChild-ViewChildren-QueryList-5.png\" alt=\"Angular - Geli\u015fmi\u015f Component Yap\u0131lanmas\u0131 | ViewChild, ViewChildren, QueryList\" width=\"245\" height=\"40\" class=\"aligncenter size-full wp-image-25932\" \/><\/a>Direktif ile yap\u0131lan bu manevray\u0131 kulland\u0131\u011f\u0131m\u0131z <a href=\"https:\/\/www.gencayyildiz.com\/blog\/angularda-dynamic-component-loading\/\" rel=\"noopener\" target=\"_blank\">Angular\u2019da Dynamic Component Loading<\/a> ba\u015fl\u0131kl\u0131 makalemizi ayr\u0131 bir \u00f6rnek olmas\u0131 a\u00e7\u0131s\u0131ndan kaynak olarak de\u011ferlendirebilece\u011finizi s\u00f6ylerek i\u00e7eri\u011fimizi burada noktalayal\u0131m derim \ud83d\ude42<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde Angular mimarisinde, DOM nesnelerine kar\u015f\u0131l\u0131k referans olu\u015fturmak i\u00e7in kullan\u0131lan ViewChild ve ViewChildren dekorat\u00f6rleriyle birlikte bu nesneleri koleksiyonel olarak elde etmemizi sa\u011flayan QueryList decorat\u00f6r\u00fcn\u00fcn i\u015flevlerini inceliyor olaca\u011f\u0131z. ViewChild ViewChild dekorat\u00f6r\u00fc, DOM&#8217;da ilk&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3014,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2420],"tags":[4650,4729,4728,4727],"class_list":["post-25909","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-angular","tag-viewchild","tag-angular-component","tag-querylist","tag-viewchildren"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25909","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=25909"}],"version-history":[{"count":15,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25909\/revisions"}],"predecessor-version":[{"id":25934,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25909\/revisions\/25934"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3014"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=25909"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=25909"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=25909"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}