﻿
{"id":26882,"date":"2024-02-18T22:34:33","date_gmt":"2024-02-18T22:34:33","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=26882"},"modified":"2024-02-18T22:34:33","modified_gmt":"2024-02-18T22:34:33","slug":"angular-17-1-input-signals","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/angular-17-1-input-signals\/","title":{"rendered":"Angular 17.1 &#8211; Input Signals"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde, Angular mimarisinin 17.1 s\u00fcr\u00fcm\u00fcnde gelmi\u015f olan ve Input decorator&#8217;\u0131n\u0131n davran\u0131\u015f\u0131n\u0131 <a href=\"https:\/\/www.gencayyildiz.com\/blog\/angular-16-signals-yapilanmasini-detayli-inceleyelim\/\" rel=\"noopener\" target=\"_blank\">signal<\/a> olarak da uygulamam\u0131z\u0131 sa\u011flayacak olan <em>Input Signals<\/em> \u00f6zelli\u011fini k\u0131saca inceliyor olaca\u011f\u0131z.<\/p>\n<blockquote><p><em style=\"color:green;\">Input Signals, geleneksel decorator yakla\u015f\u0131m\u0131na nazaran yeni bir signal tabanl\u0131 alternatiftir.<\/em><\/p><\/blockquote>\n<p>Evet, <em>Input Signals<\/em> \u00f6zelli\u011fi sayesinde <code>@angular\/core<\/code> path&#8217;i alt\u0131nda bulunan <code>input()<\/code> fonksiyonu arac\u0131l\u0131\u011f\u0131yla componentimizde bir input de\u011feri olu\u015fturulabilmekte ve bu davran\u0131\u015f\u0131n getirisi olan t\u00fcrl\u00fc avantajlardan istifade edebilmekteyiz. \u00d6ncelikle gelen bu yeni \u00f6zelli\u011fi bir \u00f6rnekle ele alarak ba\u015flayal\u0131m;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component, input } from '@angular\/core';\r\n\r\n@Component({\r\n  selector: 'app-child1',\r\n  standalone: true,\r\n  template: `\r\n  Child1 Component {{data()}}\r\n  `\r\n})\r\nexport class Child1Component {\r\n  data = input();\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki \u00f6rnek kod blo\u011funa g\u00f6z atarsan\u0131z e\u011fer <code>input()<\/code> fonksiyonu e\u015fli\u011finde bir reaktif davran\u0131\u015f sergileyen input de\u011feri tan\u0131mlanm\u0131\u015ft\u0131r. Bu de\u011fer art\u0131k \u00f6z\u00fcnde bir signal oldu\u011fu i\u00e7in html k\u0131sm\u0131nda kullan\u0131l\u0131rken bir fonksiyonvari \u015feklinde, parantezler e\u015fli\u011finde kullan\u0131ld\u0131\u011f\u0131na dikkatinizi \u00e7ekerim. Ayr\u0131ca alternatif olarak <code>input()<\/code> fonksiyonunu a\u015fa\u011f\u0131daki varyasyonlardaki gibi de kullanabilece\u011fimizi s\u00f6ylemekte fayda g\u00f6rmekteyim;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nexport class Child1Component {\r\n  data = input&lt;string&gt;();\r\n}\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nexport class Child1Component {\r\n  data = input&lt;string&gt;(&quot;initial value&quot;);\r\n}\r\n<\/pre>\n<\/div>\n<p>Velhas\u0131l kelam, g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere bu component&#8217;i selector \u00fczerinden referans edecek olan herhangi bir component&#8217;ten g\u00f6nderilebilecek bir signal yap\u0131s\u0131nda input de\u011feri olu\u015fturmu\u015f bulunuyoruz. \u0130stek do\u011frultusunda bunun kullan\u0131m\u0131 a\u015fa\u011f\u0131daki gibi olacakt\u0131r&#8230;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component } from '@angular\/core';\r\nimport { Child1Component } from '.\/child1\/child1.component';\r\n\r\n@Component({\r\n  selector: 'app-root',\r\n  standalone: true,\r\n  imports: &#x5B;Child1Component],\r\n  template: `\r\n    &lt;app-child1 &#x5B;data]=&quot;data&quot;&gt;&lt;\/app-child1&gt;\r\n  `\r\n})\r\nexport class AppComponent {\r\n  data: string = &quot;..value..&quot;;\r\n}\r\n<\/pre>\n<\/div>\n<p>Ayr\u0131ca bu input de\u011feri \u00fczerinde a\u015fa\u011f\u0131daki gibi ekstradan i\u015flemlerde ger\u00e7ekle\u015ftirilebilmektedir.<\/p>\n<ul>\n<li><strong><em>required<\/em><\/strong><br \/>\nE\u011fer ki input de\u011feri zorunlu k\u0131l\u0131nacaksa <code>required<\/code> fonksiyonu a\u015fa\u011f\u0131daki gibi kullan\u0131labilir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ndata = input.required();\r\n<\/pre>\n<\/div>\n<p>ya da<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ndata = input.required&lt;string&gt;();\r\n<\/pre>\n<\/div>\n<p>Bu i\u015flem neticesinde parent component&#8217;te bu input&#8217;a de\u011feri verilmedi\u011fi s\u00fcrece a\u015fa\u011f\u0131daki g\u00f6rseldeki gibi hata al\u0131nacakt\u0131r;<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/02\/Angular-17.1-Input-Signals.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/02\/Angular-17.1-Input-Signals.png\" alt=\"Angular 17.1 - Input Signals\" width=\"240\" height=\"103\" class=\"aligncenter size-full wp-image-26887\" \/><\/a>\n<\/li>\n<li><strong><em>alias<\/em><\/strong><br \/>\nBu signal input de\u011ferine bir alias verilerek de kullan\u0131labilir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n  data = input(&quot;initial value&quot;, {\r\n    alias: &quot;dataAlias&quot;\r\n  });\r\n<\/pre>\n<\/div>\n<p>E\u011fer ki bu \u015fekilde alias kullan\u0131m\u0131 tercih ediliyorsa o taktirde parent component&#8217;te de kullan\u0131lmas\u0131 mecburidir.<\/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;app-child1 &#x5B;dataAlias]=&quot;data&quot;&gt;&lt;\/app-child1&gt;\r\n  `\r\n})\r\nexport class AppComponent {\r\n  data: string = &quot;..value..&quot;;\r\n}\r\n<\/pre>\n<\/div>\n<\/li>\n<li><strong><em>transform<\/em><\/strong><br \/>\nAyr\u0131ca input de\u011ferini parse edebilecek a\u015fa\u011f\u0131daki gibi bir transform&#8217;da tan\u0131mlanabilir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n  data = input(&quot;initial value&quot;, {\r\n    alias: &quot;dataAlias&quot;,\r\n    transform: (value: string) =&gt; value + &quot;asd&quot;\r\n  });\r\n<\/pre>\n<\/div>\n<\/li>\n<li><strong><em>Component Input Binding<\/em><\/strong><br \/>\nVe son olarak da Input Signals \u00f6zelli\u011fi component input binding s\u00fcre\u00e7lerinde de kullan\u0131labilir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    providers: &#x5B;\r\n        provideRouter(&#x5B;\r\n            { path: &quot;child1\/:data&quot;, component: Child1Component },\r\n            { path: &quot;child2&quot;, component: Child2Component }\r\n        ], withComponentInputBinding())\r\n    ]\r\n<\/pre>\n<\/div>\n<\/li>\n<\/ul>\n<p>Tabi bu Input Signals \u00f6zelli\u011finin avantaj a\u00e7\u0131s\u0131ndan getirisi nedir diye soracak olursan\u0131z <code>ngOnChanges<\/code> event&#8217;ine nazaran <code>computed<\/code> ile daha modern bir \u00e7al\u0131\u015fma yapmam\u0131za olanak tan\u0131mas\u0131d\u0131r diyebiliriz. Bunun i\u00e7in a\u015fa\u011f\u0131daki \u00f6rne\u011fi incelemeniz yeterli olacakt\u0131r kanaatindeyim;<\/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;div &#x5B;innerHTML]=&quot;imageUrl()&quot;&gt;&lt;\/div&gt;\r\n  `\r\n})\r\nexport class ProfileComponent {\r\n  profileNo = input&lt;number&gt;();\r\n  imageUrl = computed(() =&gt; `&lt;img src=&quot;https:\/\/randomuser.me\/api\/portraits\/men\/${this.profileNo()}.jpg&quot;&gt;`)\r\n}\r\n<\/pre>\n<\/div>\n<p>Nihai olarak;<br \/>\nAngular mimarisi signal yap\u0131lanmalar\u0131 \u00fczerine olduk\u00e7a odaklanmakta ve g\u00f6r\u00fclmektedir ki gelece\u011fi bu teknoloji temellerine g\u00f6re planlamaktad\u0131r. Haliyle bu i\u00e7eri\u011fimizde de, bu vizyonda at\u0131lm\u0131\u015f olan bir ad\u0131m\u0131 daha incelemi\u015f ve Input Signal \u00f6zelli\u011fini masaya yat\u0131rm\u0131\u015f bulunuyoruz.<\/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 mimarisinin 17.1 s\u00fcr\u00fcm\u00fcnde gelmi\u015f olan ve Input decorator&#8217;\u0131n\u0131n davran\u0131\u015f\u0131n\u0131 signal olarak da uygulamam\u0131z\u0131 sa\u011flayacak olan Input Signals \u00f6zelli\u011fini k\u0131saca inceliyor olaca\u011f\u0131z. Input Signals, geleneksel decorator yakla\u015f\u0131m\u0131na nazaran yeni bir signal&#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":26698,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4958,5011],"tags":[2156,4960,5013,5012],"class_list":["post-26882","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-angular-17","category-angular-17-1","tag-angular","tag-angular-17","tag-angular-17-1","tag-input-signals"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26882","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=26882"}],"version-history":[{"count":4,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26882\/revisions"}],"predecessor-version":[{"id":26888,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26882\/revisions\/26888"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/26698"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=26882"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=26882"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=26882"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}