﻿
{"id":24165,"date":"2022-01-16T20:47:48","date_gmt":"2022-01-16T20:47:48","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=24165"},"modified":"2022-01-16T20:57:36","modified_gmt":"2022-01-16T20:57:36","slug":"angular-ngrx-kutuphanesi-ile-state-management","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/angular-ngrx-kutuphanesi-ile-state-management\/","title":{"rendered":"Angular &#8211; NgRx K\u00fct\u00fcphanesi \u0130le State Management"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>UI tabanl\u0131 geli\u015ftirilen Single Page Application(SPA) uygulamalar\u0131nda ziyaret\u00e7ilere masa\u00fcst\u00fc yaz\u0131l\u0131mlar\u0131na yak\u0131n bir dinamizm ile e\u015flik edilirken, bu avantaj\u0131n bir yandan da dezavantaj\u0131 olabilecek olan sayfada tutars\u0131z verilerin olmas\u0131 durumlar\u0131yla s\u0131k s\u0131k kar\u015f\u0131la\u015f\u0131labilmektedir. Bu tutars\u0131z verilerden kastedileni yaz\u0131n\u0131n ilerleyen paragraflar\u0131nda daha da a\u00e7acak olsak dahi k\u0131saca bahsetmemiz gerekirse e\u011fer; misal olarak uygulama ekran\u0131nda sepette \u00fc\u00e7 \u00fcr\u00fcn g\u00f6z\u00fck\u00fcyorken, metinsel k\u0131s\u0131mda ise bu say\u0131 sepettekiyle tutarl\u0131l\u0131k g\u00f6stermiyor olabilir. Ya da sepete yeni bir \u00fcr\u00fcn eklendi\u011finde veya \u00e7\u0131kar\u0131ld\u0131\u011f\u0131nda biryandan metinsel k\u0131sm\u0131n duruma g\u00f6re g\u00fcncellenmesi beklenir. Ama bazen olmayabilir. Olmayabilir, \u00e7\u00fcnk\u00fc uygulama geli\u015ftirme s\u00fcrecinde kullan\u0131lan pattern&#8217;\u0131n bizlere sa\u011flayabildi\u011fi kadar g\u00fcncellemelere \u00f6zen g\u00f6sterilse dahi bir yerden sonra uygulama kompleksitesi artarak, bu g\u00fcncellemeleri yapmak ve y\u00f6netmek zorla\u015fabilir. \u0130\u015fte bu tarz, uygulama \u00fczerinde tutarl\u0131l\u0131\u011f\u0131 ilgilendiren ve bir verinin b\u00fct\u00fcnselli\u011fi a\u00e7\u0131s\u0131ndan y\u00f6netilebilirli\u011fi sa\u011flamak i\u00e7in geli\u015ftirilen genel stratejiye <em>State Management<\/em> denmektedir. \u015eimdi gelin bu kavram nedir, k\u00f6kleri nerelere dayanmaktad\u0131r ve bizlere \u00e7\u00f6z\u00fcm olarak ne gibi yap\u0131lar sunmaktad\u0131r hep beraber inceleyelim.<\/p>\n<p>Her\u015feyden \u00f6nce, State Management&#8217;i anlayabilmek i\u00e7in State kavram\u0131n\u0131 anlamak gerekmektedir. Bizler, \u00f6nceden kaleme alm\u0131\u015f oldu\u011fumuz <a href=\"https:\/\/www.gencayyildiz.com\/blog\/finite-state-machine-nedir\/\" rel=\"noopener\" target=\"_blank\">Finite-State Machine Nedir?<\/a> ba\u015fl\u0131kl\u0131 makalemizde bir program\/yaz\u0131l\u0131m i\u00e7in state&#8217;in ne manaya geldi\u011fine de\u011finmi\u015ftik. \u0130lgili makaleye g\u00f6z atman\u0131z\u0131 \u00f6nermekle birlikte yine de bu i\u00e7eri\u011fimizde konuyu ayd\u0131nlatabilmek i\u00e7in ayr\u0131 bir dille izah etmeye \u00e7al\u0131\u015faca\u011f\u0131z.<\/p>\n<h4 style=\"color:#e83e8c;\">State Nedir?<\/h4>\n<p>Bir uygulama i\u00e7in state, o uygulaman\u0131n t\u00fcm belle\u011fidir diyebiliriz. Yani, uygulama s\u00fcrecindeki herhangi bir veri o anki state&#8217;i temsil etmektedir.<\/p>\n<p>\u0130\u015fte state bu! <em>Peki State Management nedir?<\/em> diye sordu\u011funuzu duyar gibiyim&#8230;<\/p>\n<h4 style=\"color:#e83e8c;\">State Management Nedir?<\/h4>\n<p>Uygulamadaki verilerden(yani state&#8217;lerden) herhangi biri de\u011fi\u015fkenlik g\u00f6sterdi\u011fi taktirde, bu veriyi\/state&#8217;i kullanan t\u00fcm noktalarda bu de\u011fi\u015fikli\u011fin yans\u0131mas\u0131 gerekmektedir. \u0130\u015fte bu state&#8217;lerin(yani verilerin) kullan\u0131ld\u0131\u011f\u0131 farkl\u0131 noktalar \u00fczerinde anl\u0131k de\u011fi\u015fimlerin yans\u0131mas\u0131na ise State Management denmektedir.<\/p>\n<p>En yal\u0131n haliyle State Management&#8217;\u0131nda ne oldu\u011funu \u00f6\u011frendikten sonra muhtemelen akl\u0131n\u0131zdaki <em>Peki hoca, NgRx k\u00fct\u00fcphanesi nedir?<\/em> misali sualinizi cevapland\u0131rmaya \u00e7al\u0131\u015fal\u0131m&#8230;<\/p>\n<h4 style=\"color:#e83e8c;\">NgRx K\u00fct\u00fcphanesi Nedir?<\/h4>\n<p>NgRx k\u00fct\u00fcphanesini anlayabilmek i\u00e7in Redux&#8217;\u0131, Redux&#8217;\u0131 anlayabilmek i\u00e7in ise Flux Pattern&#8217;i anlamam\u0131z gerekmektedir. Haliyle, konuyu net kavrayabilmek ve \u00f6z\u00fcmseyebilmek i\u00e7in en temelden ele almam\u0131z gerekmektedir. Eee hadi o zaman, fazla vakit kaybetmeden, buyrun ba\u015flayal\u0131m&#8230;<\/p>\n<p>\u0130lk etapta konuyu Angular mimarisi baz\u0131nda ele alarak ba\u015flayaca\u011f\u0131z. Biliyorsunuz ki, tipik bir Angular uygulamas\u0131 bir\u00e7ok bile\u015fenden meydana gelecek \u015fekilde tasarlanabilmekte ve uygulamadaki bu bile\u015fenlerin her biri, di\u011fer bile\u015fenlerin haberi olmayacak \u015fekilde kendilerine has state&#8217;ler bar\u0131nd\u0131rabilmektedir. Bu bile\u015fenlerin, bir araya gelerek meydana getirdikleri uygulamada nihai olarak b\u00fct\u00fcnsel anlamda bir uygulama verisi s\u00f6z konusu olmaktad\u0131r. \u0130\u015fte bu durumda, bile\u015fenlerden herhangi birinde olu\u015facak state de\u011fi\u015fimi, b\u00fct\u00fcnsel anlamda o state&#8217;i kullanan di\u011fer bile\u015fenlere de yans\u0131t\u0131lmas\u0131 gerekmektedir. Yani anlayaca\u011f\u0131n\u0131z birden \u00e7ok bile\u015fen bir araya geldi\u011fi zaman, sayfa tutarl\u0131l\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan bu bile\u015fenlerdeki state&#8217;lerin y\u00f6netilmesi gerekmektedir.<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management.png\" alt=\"Angular - NgRx K\u00fct\u00fcphanesi \u0130le State Management\" width=\"857\" height=\"146\" class=\"aligncenter size-full wp-image-24185\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management.png 857w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-300x51.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-768x131.png 768w\" sizes=\"auto, (max-width: 857px) 100vw, 857px\" \/><\/a>Esas\u0131nda, bile\u015fenler aras\u0131nda state de\u011fi\u015fiklikleri i\u00e7in gerekli haberle\u015fmeyi parent ve child seviyesinde @Input ve @Output tan\u0131mlar\u0131 arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015ftirebilmekteyiz. Bu konuya dair gerekli teferruat i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/angularda-input-ve-output-degiskenler-ile-componentler-arasi-iletisim\/\" rel=\"noopener\" target=\"_blank\">Angular\u2019da @Input ve @Output De\u011fi\u015fkenler \u0130le Componentler Aras\u0131 \u0130leti\u015fim<\/a> ba\u015fl\u0131kl\u0131 makaleyi okuman\u0131z yeterli olacakt\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-1.png\" alt=\"Angular - NgRx K\u00fct\u00fcphanesi \u0130le State Management\" width=\"343\" height=\"128\" class=\"alignleft size-full wp-image-24188\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-1.png 343w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-1-300x112.png 300w\" sizes=\"auto, (max-width: 343px) 100vw, 343px\" \/><\/a>Bir bile\u015fendeki de\u011fi\u015fikli\u011fi @Input veya @Output tan\u0131mlar\u0131 arac\u0131l\u0131\u011f\u0131yla di\u011fer bile\u015fene iletmek, yandaki \u015femada g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere makul say\u0131daki bile\u015fenlerin kullan\u0131ld\u0131\u011f\u0131 senaryolar i\u00e7in ge\u00e7erli olacakt\u0131r. <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-2.png\" alt=\"Angular - NgRx K\u00fct\u00fcphanesi \u0130le State Management\" width=\"354\" height=\"123\" class=\"alignright size-full wp-image-24190\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-2.png 354w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-2-300x104.png 300w\" sizes=\"auto, (max-width: 354px) 100vw, 354px\" \/><\/a>Kullan\u0131lan bile\u015fenlerin say\u0131s\u0131 sa\u011fdaki \u015femada oldu\u011fu gibi artt\u0131k\u00e7a, @Input ve @Output ile state bilgilerinin iletilmesi bildi\u011finiz kabus haline gelecektir. Misal olarak, &#8216;Component 3&#8217;den &#8216;Component 6&#8217;ya bir veri aktarmam\u0131z gerekiyorsa e\u011fer bunu ad\u0131 ge\u00e7en y\u00f6ntemlerle uygulamak, deveye hendek atlatt\u0131rmakla e\u015fde\u011ferdir. Nihayetinde bu uygulama bir gayeye hizmet etmek i\u00e7in geli\u015ftirilirken, maliyetin b\u00fcy\u00fck \u00e7o\u011funlu\u011fu bu y\u00fcksek kompleksiteye sahip operasyon i\u00e7in harcan\u0131yor olacakt\u0131r.<\/p>\n<p>\u0130\u015fte bu durum klasik bir State Management problemi ortaya koymaktad\u0131r. <\/p>\n<p><strong>Bu klasik State Management probleminin daha da tarihsel bir mazisi var m\u0131?<\/strong><\/p>\n<p>Tabi ki de! \u00d6z\u00fcnde bu tarz State Management problemini ilk olarak <em>Facebook<\/em>&#8216;un ya\u015fad\u0131\u011f\u0131na dair s\u00f6ylentiler mevcut. Hatta bir zamanlar Facebook&#8217;un chatbox&#8217;\u0131nda ki verilerle mesaj sayfas\u0131ndakilerin pek tutarl\u0131l\u0131k g\u00f6stermedi\u011fini bizzat tecr\u00fcbe etmi\u015fli\u011fim vard\u0131r(ger\u00e7i \u015fimdiki haline dairde bir fikrim yok) \u0130\u015fte bu durum state management ile ilgilidir. Facebook, ayn\u0131 verileri kullanacak \u015fekilde zamanla eklenen ekstra bile\u015fenlerin e\u015fli\u011finde uygulamadaki state management kompleksitesinin artt\u0131\u011f\u0131n\u0131 s\u00f6ylemekte ve bunun sebebini kulland\u0131\u011f\u0131 klasik veri\/model yakla\u015f\u0131m\u0131na y\u00fcklemektedir.<br \/>\n<div id=\"attachment_7001\" style=\"width: 560px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/03\/Two-Way-Data-Binding\u0130ki-Y\u00f6nl\u00fc-Veri-Ba\u011flama.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-7001\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/03\/Two-Way-Data-Binding\u0130ki-Y\u00f6nl\u00fc-Veri-Ba\u011flama.png\" alt=\"Two Way Data Binding(\u0130ki Y\u00f6nl\u00fc Veri Ba\u011flama)\" width=\"550\" height=\"235\" class=\"size-full wp-image-7001\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/03\/Two-Way-Data-Binding\u0130ki-Y\u00f6nl\u00fc-Veri-Ba\u011flama.png 550w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/03\/Two-Way-Data-Binding\u0130ki-Y\u00f6nl\u00fc-Veri-Ba\u011flama-300x128.png 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><p id=\"caption-attachment-7001\" class=\"wp-caption-text\">Bu modelde view&#8217;\u0131n render edilmesi modeldeki de\u011fi\u015fiklik \u00fczerine kurgulanm\u0131\u015ft\u0131r. Halbuki bir view&#8217;deki modelde yap\u0131lan de\u011fi\u015fiklik, o modeli kullanan di\u011fer bir view(ler)&#8217;e yans\u0131mad\u0131\u011f\u0131 s\u00fcrece tutars\u0131zl\u0131k s\u00f6z konusu olacakt\u0131r.<br \/><span style=\"font-size:12px;\">Burada view&#8217;den kas\u0131t component&#8217;lerdir.<\/span><\/p><\/div><\/p>\n<p>Haliyle Facebook buradaki two way databinding modeli yerine bir yerden sonra daha geli\u015fmi\u015f bir stratejiyi modellemektedir, Flux Pattern!<\/p>\n<h4 style=\"color:#e83e8c;\">Flux Pattern Nedir?<\/h4>\n<p><div id=\"attachment_24199\" style=\"width: 630px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-24199\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management.jpg\" alt=\"Angular - NgRx K\u00fct\u00fcphanesi \u0130le State Management\" width=\"620\" height=\"276\" class=\"size-full wp-image-24199\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management.jpg 620w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-300x134.jpg 300w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a><p id=\"caption-attachment-24199\" class=\"wp-caption-text\"><span style=\"font-size:12px;\">Kaynak : https:\/\/krasimir.gitbooks.io\/react-in-patterns\/content\/chapter-08\/<\/span><\/p><\/div><br \/>\nFlux Pattern, yukar\u0131daki \u015femada g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere view&#8217;de olabilecek herhangi bir state de\u011fi\u015fikli\u011fini ifade eden action isimli talimat\u0131 dispatcher&#8217;a g\u00f6ndererek, onun arac\u0131l\u0131\u011f\u0131yla store&#8217;lara bildirmektedir.<\/p>\n<p><strong>Peki nedir bu action, dispatcher ve store?<\/strong><\/p>\n<ul>\n<li><strong>Action;<\/strong> state&#8217;de yap\u0131lan de\u011fi\u015fikli\u011fi tarif edecek olan g\u00f6vdeyi bar\u0131nd\u0131ran bir talimatt\u0131r. Yap\u0131s\u0131 a\u015fa\u011f\u0131daki gibidir;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-3.png\" alt=\"Angular - NgRx K\u00fct\u00fcphanesi \u0130le State Management\" width=\"438\" height=\"322\" class=\"aligncenter size-full wp-image-24205\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-3.png 438w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-3-300x221.png 300w\" sizes=\"auto, (max-width: 438px) 100vw, 438px\" \/><\/a>\n<\/li>\n<li><strong>Dispatcher;<\/strong> ise kendinde tan\u0131ml\u0131 olan t\u00fcm store&#8217;lara gelen action&#8217;\u0131 yay\u0131nlamakla g\u00f6revlidir ve state&#8217;de yap\u0131lan de\u011fi\u015fikli\u011fe dair haber almalar\u0131n\u0131 sa\u011flamaktad\u0131r. Yani, yay\u0131nlanan action, dispatcher&#8217;a g\u00f6nderilmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-4.png\" alt=\"Angular - NgRx K\u00fct\u00fcphanesi \u0130le State Management\" width=\"373\" height=\"273\" class=\"aligncenter size-full wp-image-24208\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-4.png 373w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-4-300x220.png 300w\" sizes=\"auto, (max-width: 373px) 100vw, 373px\" \/><\/a>\n<\/li>\n<li><strong>Store;<\/strong> state&#8217;in tutuldu\u011fu yap\u0131lard\u0131r. Store&#8217;da, ilgili state&#8217;e dair bir de\u011fi\u015fiklik yap\u0131lacaksa bu sorumlulu\u011fu <em style=\"color:purple;\"><strong>Reducer<\/strong><\/em> isimli fonksiyonlar \u00fcstlenmektedir. Bu fonksiyonlar\u0131 yaz\u0131m\u0131z\u0131n ilerleyen sat\u0131rlar\u0131nda ele al\u0131yor olaca\u011f\u0131z&#8230;<\/li>\n<\/ul>\n<p>Yukar\u0131daki d\u00f6ng\u00fc i\u015fledi\u011fi an, state&#8217;de de\u011fi\u015fiklik ger\u00e7ekle\u015fecek ve art\u0131k ilgili state&#8217;i kullanan t\u00fcm view&#8217;lerin haberdar edilmesi gerekecektir. Haliyle bu i\u015flemi de <em style=\"color:purple;\"><strong>Controller View<\/strong><\/em> ismini verdi\u011fimiz mekanizma \u00fcstlenecektir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-5-300x211.png\" alt=\"Angular - NgRx K\u00fct\u00fcphanesi \u0130le State Management\" width=\"300\" height=\"211\" class=\"alignleft size-medium wp-image-24211\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-5-300x211.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-5.png 399w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Controller View, yandaki \u015fema da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere uygulamadaki t\u00fcm view&#8217;ler ile haberle\u015fen bir nesnedir. E\u011fer ki store&#8217;da herhangi bir state verisinde bir de\u011fi\u015fiklik olursa buna g\u00f6re view&#8217;leri render edecektir.<\/p>\n<p>\u0130\u015fte Flux Pattern bu \u015fekilde bir mant\u0131kla uygulanmaktad\u0131r. Dikkat ederseniz e\u011fer uygulama yap\u0131s\u0131 b\u00fcy\u00fcd\u00fck\u00e7e ve uygulaman\u0131n kompleksitesi artt\u0131k\u00e7a bu pattern&#8217;\u0131n uygulanmas\u0131 zorla\u015fmaktad\u0131r. \u00c7\u00fcnk\u00fc birden fazla store&#8217;un kullan\u0131lmas\u0131, zamanla uygulama b\u00fcy\u00fckl\u00fc\u011f\u00fcyle do\u011fru orant\u0131l\u0131 bir \u015fekilde birbirlerine ba\u011f\u0131ml\u0131 olabilmelerine sebep olmakta ve bunlar\u0131n orkestra edilmesi git gide zorla\u015fmaktad\u0131r.<\/p>\n<p>Bu noktada bu pattern&#8217;in daha rahat uygulanmas\u0131n\u0131 sa\u011flayan Redux kar\u015f\u0131m\u0131za \u00e7\u0131kmaktad\u0131r.<\/p>\n<h4 style=\"color:#e83e8c;\">Redux Nedir?<\/h4>\n<p>Angular gibi JavaScript temelli uygulamalarda State Management s\u00fcre\u00e7lerini basitle\u015ftirmek i\u00e7in kullan\u0131lan pattern&#8217;d\u0131r. Temel olarak <em style=\"color:green;\">Single source of truth\u200b<\/em>, <em style=\"color:green;\">State is read-only\u200b<\/em> ve <em style=\"color:green;\">Changes are made with pure functions\u200b<\/em> olmak \u00fczere \u00fc\u00e7 ilkeye dayanmaktad\u0131r. Direkt ilkeleri izah etmemiz gerekirse e\u011fer;<\/p>\n<ul>\n<li><strong>Single source of truth\u200b<\/strong> <em style=\"color:green;\">Tek do\u011fru kaynak\u200b<\/em><br \/>\nUygulamada state&#8217;in tek bir store&#8217;da tutulmas\u0131n\u0131 ifade etmektedir.\n<\/li>\n<li><strong>State is read-only<\/strong> <em style=\"color:green;\">Salt-okunur durum<\/em><br \/>\nStore&#8217;da ki mevcut state verilerinin de\u011fi\u015fmezli\u011fini ifade eder. Yani, state&#8217;de olan de\u011fi\u015fiklik o anki store&#8217;da ki veri \u00fczerinde de\u011fil, onun klonlanm\u0131\u015f hali \u00fczerinde uygulanmal\u0131d\u0131r.\n<\/li>\n<li><strong>Changes are made with pure functions\u200b<\/strong> <em style=\"color:green;\">De\u011fi\u015fiklikler saf fonksiyonlarla yap\u0131l\u0131r<\/em><br \/>\nStore&#8217;lar \u00fczerindeki de\u011fi\u015fikliklerin sadece o i\u015fe odaklanm\u0131\u015f reducer ismini verdi\u011fimiz fonksiyonlar ile yap\u0131lmas\u0131n\u0131 ifade eder.\n<\/li>\n<\/ul>\n<p><div id=\"attachment_24220\" style=\"width: 310px\" class=\"wp-caption alignright\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-6.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-24220\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-6-300x167.png\" alt=\"Angular - NgRx K\u00fct\u00fcphanesi \u0130le State Management\" width=\"300\" height=\"167\" class=\"size-medium wp-image-24220\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-6-300x167.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-6.png 479w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-24220\" class=\"wp-caption-text\"><span style=\"font-size:12px;\">Kaynak : https:\/\/blog.mazarin.lk\/productive-development-react-redux\/<\/span><\/p><\/div>Redux&#8217;u daha iyi anlayabilmek i\u00e7in yandaki g\u00f6rsel \u015femay\u0131 incelemenizde fayda g\u00f6rmekteyim.<\/p>\n<p>Dikkat ederseniz e\u011fer Redux tek bir store&#8217;dan beslenmekte ve t\u00fcm component&#8217;lere o store \u00fczerinden veri sa\u011flamaktad\u0131r. Redux&#8217;un kullan\u0131lmad\u0131\u011f\u0131 durumlarda ise bir arapsa\u00e7\u0131 misali davran\u0131\u015f sergilenmektedir.<\/p>\n<blockquote><p><em style=\"color:purple;\">Redux&#8217;da state, read-only&#8217;dir. De\u011fi\u015fmez! (Flux pattern&#8217;da de\u011fi\u015fiklik oluyordu!) Redux&#8217;da immutability prensibi s\u00f6z konusudur. State de\u011fi\u015fecekse e\u011fer mevcut olan kopyalan\u0131p, \u00fczerinde de\u011fi\u015fiklik ger\u00e7ekle\u015ftirilerek i\u015flem sa\u011flan\u0131r.<\/em><\/p><\/blockquote>\n<p><strong>Peki Redux pattern&#8217;\u0131n \u00e7al\u0131\u015fma mant\u0131\u011f\u0131 nas\u0131ld\u0131r?<\/strong><br \/>\nRedux pattern&#8217;\u0131n \u00e7al\u0131\u015fma mant\u0131\u011f\u0131n\u0131 anlayabilmek i\u00e7in a\u015fa\u011f\u0131daki g\u00f6rsel \u015femay\u0131 incelemenizi tavsiye ederim.<br \/>\n<div id=\"attachment_24228\" style=\"width: 1034px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-7.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-24228\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-7-1024x423.png\" alt=\"Angular - NgRx K\u00fct\u00fcphanesi \u0130le State Management\" width=\"1024\" height=\"423\" class=\"size-large wp-image-24228\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-7-1024x423.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-7-300x124.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-7-768x317.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-7.png 1096w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><p id=\"caption-attachment-24228\" class=\"wp-caption-text\"><span style=\"font-size:12px;\">Kaynak : https:\/\/labs.tadigital.com\/index.php\/2020\/04\/20\/getting-started-with-redux\/<\/span><\/p><\/div>\u015eemadan g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, UI&#8217;da(yani view&#8217;de) herhangi bir state de\u011fi\u015fikli\u011fi s\u00f6z konusu oldu\u011funda bu de\u011fi\u015fikli\u011fi temsil eden bir action f\u0131rlat\u0131lmakta ve f\u0131rlat\u0131lan bu action&#8217;\u0131 reducer fonksiyonu ile yakalayarak yap\u0131lan de\u011fi\u015fiklik alg\u0131lanmakta ve store&#8217;da ki mevcut state yerine gerekli g\u00fcncellemelerin yap\u0131ld\u0131\u011f\u0131 yeni state olu\u015fturularak, store&#8217;a g\u00f6nderilmektedir. Bu i\u015flem neticesinde, store&#8217;da yenilenen state verisi ilgili t\u00fcm view&#8217;ler taraf\u0131ndan g\u00fcncellenmi\u015f olacakt\u0131r.<\/p>\n<p>Konuyu teoride daha da netle\u015ftirebilmek i\u00e7in a\u015fa\u011f\u0131daki hareketli g\u00f6rseli inceleyiniz.<br \/>\n<div id=\"attachment_24235\" style=\"width: 1450px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management.gif\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-24235\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management.gif\" alt=\"Angular - NgRx K\u00fct\u00fcphanesi \u0130le State Management\" width=\"1440\" height=\"1080\" class=\"size-full wp-image-24235\" \/><\/a><p id=\"caption-attachment-24235\" class=\"wp-caption-text\"><span style=\"font-size:12px;\">Kaynak : https:\/\/ichi.pro\/tr\/redux-icin-crash-course-98889338959570<\/span><\/p><\/div><\/p>\n<p>Evet&#8230; NgRx ile ilgili t\u00fcm altyap\u0131y\u0131 inceledi\u011fimize g\u00f6re art\u0131k sadede gelebiliriz. <strong>NgRx Nedir?<\/strong> sorusunu cevaplayabiliriz.<\/p>\n<p>NgRx, Redux Pattern&#8217;i benimsemi\u015f ve RxJS k\u00fct\u00fcphanesiyle desteklenmi\u015f olan Angular&#8217;a \u00f6zel State Management \u00e7\u00f6z\u00fcmleri i\u00e7in geli\u015ftirilmi\u015f bir k\u00fct\u00fcphanedir.<\/p>\n<p>\u015eimdi, sonlara do\u011fru NgRx ile basit bir \u00f6rnek \u00fczerinden i\u00e7eri\u011fimizi zenginle\u015ftirip, noktalayal\u0131m.<\/p>\n<h4 style=\"color:#e83e8c;\">NgRx K\u00fct\u00fcphanesi \u0130le \u00d6rnek State Management Uygulamas\u0131<\/h4>\n<p>\u0130cra edece\u011fimiz \u00f6rnekte bir ders uygulamas\u0131n\u0131 baz al\u0131yor olaca\u011f\u0131z. Bu uygulamada dersleri ekledi\u011fimiz, listeledi\u011fimiz ve ders adedini yay\u0131nlad\u0131\u011f\u0131m\u0131z \u00fc\u00e7 farkl\u0131 componentimiz olacakt\u0131r. Haliyle ders say\u0131s\u0131nda herhangi bir de\u011fi\u015fiklik oldu\u011fu taktirde listeleme ve adedi g\u00f6stermekten sorumlu componentlerin gerekli g\u00fcncellemeleri yapabilmesi i\u00e7in NgRx ile state management&#8217;\u0131 sa\u011fl\u0131yor olaca\u011f\u0131z.<\/p>\n<p>Her \u015feyden \u00f6nce uygulamada kullanaca\u011f\u0131m\u0131z k\u00fct\u00fcphaneleri a\u015fa\u011f\u0131daki npm komutu e\u015fli\u011finde y\u00fckleyerek ba\u015flayal\u0131m.<br \/>\n<strong style=\"color:purple;font-size:14px;\"><code>npm i jquery bootstrap @ngrx\/store<\/code><\/strong><br \/>\n<span style=\"font-size:14px;\">(Angular uygulamalar\u0131nda NgRx k\u00fct\u00fcphanesini <em style=\"color:red;\">@ngrx\/store<\/em> paketi sa\u011flamaktad\u0131r.)<\/span><\/p>\n<p>Ard\u0131ndan uygulamada kullan\u0131lacak componentleri olu\u015ftural\u0131m.<br \/>\n<strong style=\"color:purple;font-size:14px;\"><code>ng g c components\/lessonCreate<\/code> <br \/> <code>ng g c components\/lessonRead<\/code> <br \/> <code>ng g c components\/lessonCount<\/code><\/strong><\/p>\n<p>\u015eimdi hafiften kodlamaya girerek ba\u015flayal\u0131m.<\/p>\n<p>&#8216;app.component.html&#8217; dosyas\u0131nda uygulaman\u0131n genel HTML \u00e7at\u0131s\u0131n\u0131 a\u015fa\u011f\u0131daki gibi olu\u015ftural\u0131m. Tabi bu konuda sizler kendi \u00f6zg\u00fcr iradenize g\u00f6re \u00e7al\u0131\u015fma sergileyebilirsiniz. Ben deniz, hasbel kader a\u015fa\u011f\u0131daki gibi (k\u0131yt\u0131r\u0131ktan)bir tasar\u0131m \u00fczerinden y\u00fcr\u00fcyor olaca\u011f\u0131m.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n&lt;div class=&quot;row&quot;&gt;\r\n  &lt;div class=&quot;col-md-3&quot;&gt;Ders Ekle&lt;\/div&gt;\r\n  &lt;div class=&quot;col-md-3&quot;&gt;Ders Listesi&lt;\/div&gt;\r\n  &lt;div class=&quot;col-md-3&quot;&gt;Ders Adedi&lt;\/div&gt;\r\n&lt;\/div&gt;\r\n&lt;div class=&quot;row&quot;&gt;\r\n  &lt;div class=&quot;col-md-3&quot; style=&quot;background-color: antiquewhite;&quot;&gt;\r\n    &lt;app-lesson-create&gt;&lt;\/app-lesson-create&gt;\r\n  &lt;\/div&gt;\r\n  &lt;div class=&quot;col-md-3&quot; style=&quot;background-color: darkgrey&quot;&gt;\r\n    &lt;app-lesson-read&gt;&lt;\/app-lesson-read&gt;\r\n  &lt;\/div&gt;\r\n  &lt;div class=&quot;col-md-3&quot; style=&quot;background-color: ghostwhite&quot;&gt;\r\n    &lt;app-lesson-count&gt;&lt;\/app-lesson-count&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/div&gt;\r\n<\/pre>\n<p>Ard\u0131ndan uygulamada verisel a\u00e7\u0131dan bir derse kar\u015f\u0131l\u0131k gelecek olan &#8216;Lesson&#8217; isimli entity&#8217;i olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nexport class Lesson {\r\n    id: number;\r\n    lesson: string;\r\n    explanation: string;\r\n}\r\n<\/pre>\n<p>Bu noktadan itibaren uygulamam\u0131z\u0131n temellerini atm\u0131\u015f bulunmaktay\u0131z. Art\u0131k yap\u0131lmas\u0131 gereken NgRx enstr\u00fcmanlar\u0131n\u0131 tek tek in\u015fa etmektir. Hadi buyrun ba\u015flayal\u0131m.<\/p>\n<ul>\n<li><strong>Ad\u0131m 1<\/strong> <em style=\"font-size:12px;color:green;\">Action Olu\u015fturma<\/em><br \/>\nNgRx a\u00e7\u0131s\u0131ndan ilk yap\u0131lmas\u0131 gereken i\u015f, state de\u011fi\u015fikliklerinin g\u00f6vdesini tan\u0131mlamakt\u0131r. Yani action&#8217;lar\u0131 tan\u0131mlamak! Bunun i\u00e7in <em style=\"color:blue;\">&#8216;@ngrx\/store&#8217;<\/em> alt\u0131ndaki <em style=\"color:blue;\">&#8216;createAction&#8217;<\/em> fonksiyonunu a\u015fa\u011f\u0131daki gibi kullanabilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { createAction, props } from &quot;@ngrx\/store&quot;;\r\nimport { Lesson } from &quot;src\/app\/models\/lesson&quot;;\r\n\r\n\/\/Action Type\r\nexport const ADD_LESSON = '&#x5B;ADD LESSON] Lesson';\r\n\r\n\/\/Action Type\r\nexport const REMOVE_LESSON = '&#x5B;REMOVE LESSON] Lesson';\r\n\r\n\/\/Action\r\nexport const addLesson = createAction(ADD_LESSON, props&lt;Lesson&gt;());\r\n\r\n\/\/Action\r\nexport const removeLesson = createAction(REMOVE_LESSON, props&lt;Lesson&gt;());\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer &#8216;addLesson&#8217; ve &#8216;removeLesson&#8217; olmak \u00fczere iki adet action tan\u0131mlanm\u0131\u015ft\u0131r. Bu action&#8217;lar s\u0131ras\u0131yla, ders ekleme ve ders silme durumlar\u0131na kar\u015f\u0131l\u0131k gelmektedirler.\n<\/li>\n<li><strong>Ad\u0131m 2<\/strong> <em style=\"font-size:12px;color:green;\">Reducer Olu\u015fturma<\/em><br \/>\nAction&#8217;lar tan\u0131mland\u0131ktan sonra f\u0131rlat\u0131lan action&#8217;a g\u00f6re store&#8217;da ki state&#8217;de de\u011fi\u015fiklik yapacak olan reducer fonksiyonlar\u0131n\u0131 olu\u015fturmam\u0131z gerekmektedir. Bunun i\u00e7in de <em style=\"color:blue;\">&#8216;@ngrx\/store&#8217;<\/em>da ki <em style=\"color:blue;\">&#8216;createReducer&#8217;<\/em> fonksiyonu kullan\u0131labilir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { createReducer, on } from &quot;@ngrx\/store&quot;;\r\nimport { Lesson } from &quot;src\/app\/models\/lesson&quot;;\r\nimport { addLesson, removeLesson } from &quot;..\/actions\/lesson.action&quot;;\r\n\r\n\/\/State Type\r\nexport interface IState {\r\n    data: Lesson&#x5B;];\r\n}\r\n\r\n\/\/Initial State\r\nexport const initialLessonState: IState = {\r\n    data: Array&lt;Lesson&gt;()\r\n}\r\n\r\n\/\/Reducer\r\nexport const lessonReducer = createReducer(initialLessonState,\r\n    on(addLesson, (state, lesson) =&gt; {\r\n        const newState: IState = {\r\n            data: &#x5B;...state.data, lesson]\r\n        }\r\n        return newState;\r\n    }),\r\n    on(removeLesson, (state, lesson) =&gt; {\r\n        const deleteLesson = state.data.find(l =&gt; l.id == lesson.id);\r\n        const deleteLessonIndexNo = state.data.indexOf(deleteLesson);\r\n        const newState: IState = {\r\n            data: &#x5B;...state.data]\r\n        };\r\n        newState.data.splice(deleteLessonIndexNo, 1);\r\n        return newState;\r\n    })\r\n);\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu siz incelerken bir yandan da ben izah edersem e\u011fer ilk olarak <strong>6.<\/strong> sat\u0131rdaki interface&#8217;den ba\u015flayal\u0131m. Bu interface ders i\u00e7in tutulacak state&#8217;in aray\u00fcz\u00fcn\u00fc ya da bir ba\u015fka deyi\u015fle tipini ifade etmektedir. <strong>11.<\/strong> sat\u0131rdaki &#8216;initialLessonState&#8217; nesnesine gelirsek e\u011fer uygulamadaki default ders state&#8217;ini ifade etmektedir. State management operasyonlar\u0131nda hi\u00e7bir state olmasa da default bir state&#8217;in olmas\u0131 zorunludur! <strong>16<\/strong> ile <strong>32.<\/strong> sat\u0131r aral\u0131\u011f\u0131na g\u00f6z atarsan\u0131z e\u011fer, i\u015fte bu bizim reducer fonksiyonumuzdur. Bu fonksiyon i\u00e7erisinde her bir action&#8217;a \u00f6zel gerekli operasyonlar y\u00fcr\u00fct\u00fclmektedir. Bu operasyonlar\u0131 da yine <em style=\"color:blue;\">&#8216;@ngrx\/store&#8217;<\/em> i\u00e7erisindeki <em style=\"color:blue;\">&#8216;on&#8217;<\/em> fonksiyonu ile ger\u00e7ekle\u015ftirebilmekteyiz.\n<\/li>\n<li><strong>Ad\u0131m 3<\/strong> <em style=\"font-size:12px;color:green;\">AppModule&#8217;e Bildiride Bulunma<\/em><br \/>\nSon olarak yap\u0131lmas\u0131 gereken ise NgRx ile ilgili sa\u011flanan t\u00fcm bu konfig\u00fcrasyonlar\u0131 Angular uygulamas\u0131n\u0131n ana mod\u00fcl\u00fc olan AppModule s\u0131n\u0131f\u0131na bildirmektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\nimport { StoreModule } from '@ngrx\/store';\r\nimport { lessonReducer } from '.\/stateManagement\/reducers\/lesson.reducer';\r\n\r\n@NgModule({\r\n  declarations: &#x5B;\r\n    AppComponent,\r\n    LessonCreateComponent,\r\n    LessonReadComponent,\r\n    LessonCountComponent\r\n  ],\r\n  imports: &#x5B;\r\n    BrowserModule,\r\n    AppRoutingModule,\r\n    StoreModule.forRoot({\r\n      lesson: lessonReducer\r\n    })\r\n  ],\r\n  providers: &#x5B;],\r\n  bootstrap: &#x5B;AppComponent]\r\n})\r\nexport class AppModule { }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere AppModule i\u00e7erisinde &#8216;imports&#8217; alan\u0131nda &#8216;StoreModule.forRoot&#8217; fonksiyonu ile olu\u015fturmu\u015f oldu\u011fumuz &#8216;lessonReducer&#8217; isimli reducer&#8217;imiz uygulamaya &#8216;lesson&#8217; key&#8217;i kar\u015f\u0131l\u0131\u011f\u0131nda tan\u0131mlanm\u0131\u015f bulunmaktad\u0131r. Tabi uygulama s\u00fcrecinde birden fazla reducer varsa e\u011fer t\u00fcm bunlar kendilerine \u00f6zel key&#8217;ler kar\u015f\u0131l\u0131\u011f\u0131nda tan\u0131mlan\u0131p, uygulama a\u00e7\u0131s\u0131ndan bildirilmeleri gerekmektedir.\n<\/li>\n<\/ul>\n<p>NgRx&#8217;in enstr\u00fcmanlar\u0131n\u0131 in\u015fa etti\u011fimize g\u00f6re art\u0131k component&#8217;ler de gerekli geli\u015ftirmeleri ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<ul>\n<li><strong><em style=\"color:purple;\">lesson-create.component<\/em><\/strong><br \/>\n.html;<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n&lt;input type=&quot;number&quot; #txtId placeholder=&quot;Id&quot;&gt; &lt;br&gt;\r\n&lt;input type=&quot;text&quot; #txtLesson placeholder=&quot;Lesson&quot;&gt; &lt;br&gt;\r\n&lt;input type=&quot;text&quot; #txtExplanation placeholder=&quot;Explanation&quot;&gt; &lt;br&gt;\r\n&lt;button (click)=&quot;createLesson(txtId.value, txtLesson.value, txtExplanation.value)&quot;&gt;Add Lesson&lt;\/button&gt;\r\n<\/pre>\n<p>.ts;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component, OnInit } from '@angular\/core';\r\nimport { Store } from '@ngrx\/store';\r\nimport { Observable } from 'rxjs';\r\nimport { Lesson } from 'src\/app\/models\/lesson';\r\nimport { addLesson } from 'src\/app\/stateManagement\/actions\/lesson.action';\r\n\r\n@Component({\r\n  selector: 'app-lesson-create',\r\n  templateUrl: '.\/lesson-create.component.html',\r\n  styleUrls: &#x5B;'.\/lesson-create.component.css']\r\n})\r\nexport class LessonCreateComponent implements OnInit {\r\n\r\n  constructor(private store: Store&lt;Lesson&gt;) { }\r\n  lesson: Observable&lt;string&gt;;\r\n  ngOnInit(): void {\r\n    this.lesson = this.store.select(&quot;lesson&quot;);\r\n  }\r\n\r\n  createLesson(id: string, lesson: string, explanation: string) {\r\n    const l: Lesson = new Lesson();\r\n    l.id = parseInt(id);\r\n    l.explanation = explanation;\r\n    l.lesson = lesson;\r\n    this.store.dispatch(addLesson(l));\r\n  }\r\n}\r\n<\/pre>\n<p>Herhangi bir component&#8217;ten store&#8217;a eri\u015febilmek i\u00e7in <em style=\"color:blue;\">&#8216;Store&lt;T&gt;&#8217;<\/em> t\u00fcr\u00fcnden nesneyi dependency injection ile talep etmemiz yeterli olacakt\u0131r. E\u011fer ki store&#8217;a de\u011fer g\u00f6nderilecekse <em style=\"color:blue;\">&#8216;dispatch&#8217;<\/em> fonksiyonu e\u015fli\u011finde ilgili action&#8217;\u0131n \u00e7a\u011fr\u0131lmas\u0131 yeterli olacakt\u0131r. Bu arada <strong>17.<\/strong> sat\u0131ra bakarsan\u0131z e\u011fer ilgili store&#8217;un hangi key&#8217;e kar\u015f\u0131l\u0131k store oldu\u011funu &#8216;ngOnInit&#8217; \u00fczerinden belirtmekteyiz.\n<\/li>\n<li><strong><em style=\"color:purple;\">lesson-read.component<\/em><\/strong><br \/>\n.html;<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n&lt;p *ngFor=&quot;let lesson of lessons.data&quot;&gt;{{lesson.lesson}} - {{lesson.explanation}} &amp;nbsp; &lt;span\r\n    style=&quot;color: chocolate;cursor: pointer;background-color: cornsilk;&quot; (click)=&quot;removeLesson(lesson)&quot;&gt;X&lt;\/span&gt; &lt;\/p&gt;\r\n<\/pre>\n<p>.ts;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component, OnInit } from '@angular\/core';\r\nimport { Store } from '@ngrx\/store';\r\nimport { Lesson } from 'src\/app\/models\/lesson';\r\nimport { removeLesson } from 'src\/app\/stateManagement\/actions\/lesson.action';\r\n\r\n@Component({\r\n  selector: 'app-lesson-read',\r\n  templateUrl: '.\/lesson-read.component.html',\r\n  styleUrls: &#x5B;'.\/lesson-read.component.css']\r\n})\r\nexport class LessonReadComponent implements OnInit {\r\n\r\n  constructor(private store: Store&lt;Lesson&gt;) { }\r\n  lessons: any;\r\n  ngOnInit(): void {\r\n    this.store.select(&quot;lesson&quot;).subscribe(lesson =&gt; {\r\n      this.lessons = lesson;\r\n    });\r\n  }\r\n\r\n  removeLesson(lesson: Lesson) {\r\n    this.store.dispatch(removeLesson(lesson));\r\n  }\r\n}\r\n\r\n<\/pre>\n<\/li>\n<li><strong><em style=\"color:purple;\">lesson-count.component<\/em><\/strong><br \/>\n.html;<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nLesson Count : {{count}}\r\n<\/pre>\n<p>.ts;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component, OnInit } from '@angular\/core';\r\nimport { Store } from '@ngrx\/store';\r\nimport { Observable } from 'rxjs';\r\nimport { Lesson } from 'src\/app\/models\/lesson';\r\n\r\n@Component({\r\n  selector: 'app-lesson-count',\r\n  templateUrl: '.\/lesson-count.component.html',\r\n  styleUrls: &#x5B;'.\/lesson-count.component.css']\r\n})\r\nexport class LessonCountComponent implements OnInit {\r\n\r\n  constructor(private store: Store&lt;Lesson&gt;) { }\r\n  lesson: Observable&lt;string&gt;;\r\n  count: number;\r\n  ngOnInit(): void {\r\n    this.lesson = this.store.select(&quot;lesson&quot;);\r\n    this.lesson.subscribe((lessons: any) =&gt; this.count = lessons.data.length);\r\n  }\r\n}\r\n<\/pre>\n<\/li>\n<\/ul>\n<p>\u0130\u015fte bu kadar&#8230;<\/p>\n<p>Uygulamay\u0131 derleyip, \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi davran\u0131\u015f g\u00f6sterecektir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Angular-NgRx-Kutuphanesi-Ile-State-Management-1.gif\" alt=\"Angular - NgRx K\u00fct\u00fcphanesi \u0130le State Management\" width=\"800\" height=\"114\" class=\"aligncenter size-full wp-image-24281\" \/><\/a><\/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<p>Not : \u00d6rnek projeyi indirmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/NgRx-Example-Project.zip\" rel=\"noopener\" target=\"_blank\">buraya<\/a> t\u0131klay\u0131n\u0131z.<\/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, UI tabanl\u0131 geli\u015ftirilen Single Page Application(SPA) uygulamalar\u0131nda ziyaret\u00e7ilere masa\u00fcst\u00fc yaz\u0131l\u0131mlar\u0131na yak\u0131n bir dinamizm ile e\u015flik edilirken, bu avantaj\u0131n bir yandan da dezavantaj\u0131 olabilecek olan sayfada tutars\u0131z verilerin olmas\u0131 durumlar\u0131yla s\u0131k s\u0131k kar\u015f\u0131la\u015f\u0131labilmektedir. Bu&#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":24282,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2420],"tags":[4500,4501,4497,4499,4498,4506,4503,4496,4505,4504,4493,4494,4382,4495,4383,4502],"class_list":["post-24165","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-angular","tag-action-nedir","tag-dispatcher-nedir","tag-flux-pattern","tag-ngrx","tag-ngrx-kutuphanesi","tag-ngrx-nedir","tag-reducer-nedir","tag-redux","tag-redux-pattern","tag-redux-pattern-nedir","tag-single-page-application","tag-spa","tag-state","tag-state-management","tag-state-nedir","tag-store-nedir"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24165","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=24165"}],"version-history":[{"count":104,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24165\/revisions"}],"predecessor-version":[{"id":24286,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24165\/revisions\/24286"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/24282"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=24165"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=24165"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=24165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}