{"id":26982,"date":"2024-03-05T05:00:00","date_gmt":"2024-03-05T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=26982"},"modified":"2024-07-22T14:13:40","modified_gmt":"2024-07-22T12:13:40","slug":"angular-17-jak-pracowac-z-nowymi-widokami","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/angular-17-jak-pracowac-z-nowymi-widokami\/","title":{"rendered":"Angular 17 \u2013 jak pracowa\u0107 z nowymi widokami"},"content":{"rendered":"\n<p>Wraz z nadej\u015bciem kolejnej wersji Angulara (wersja 17.) w listopadzie 2023 roku, pojawi\u0142y si\u0119 nowe funkcjonalno\u015bci do pracy z widokami HTML, kt\u00f3re s\u0105 bardziej czytelne od wcze\u015bniejszych. Mam tu na my\u015bli cz\u0119sto u\u017cywane *ngIf, *ngFor, a tak\u017ce *ngSwitch, b\u0119d\u0105ce podstawowymi, wbudowanymi dyrektywami od pocz\u0105tku istnienia angularowego \u015bwiata.<\/p>\n\n\n\n<p>W artykule, na podstawie przyk\u0142ad\u00f3w, opisz\u0119 i por\u00f3wnam:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>jak wygl\u0105da\u0142o u\u017cywanie wcze\u015bniejszych dyrektyw;&nbsp;<\/li>\n\n\n\n<li>w jaki spos\u00f3b mo\u017cemy skorzysta\u0107 z istniej\u0105cego nowego rozwi\u0105zania;&nbsp;<\/li>\n\n\n\n<li>jakie dodatkowe elementy wprowadza nowy<strong> Control Flow, <\/strong>pozwalaj\u0105c na \u0142atwiejsze budowanie aplikacji np. @empty;<\/li>\n<\/ul>\n\n\n\n<p>\u0142atwiejszy i wygodniejszy spos\u00f3b na dodawanie trackBy do @for.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Pierwsze kroki<\/strong><\/h2>\n\n\n\n<p>Pami\u0119tajmy, aby zainstalowa\u0107 Angulara w wersji 17.\u00a0Aby to zrobi\u0107, nale\u017cy u\u017cy\u0107 terminala, wykonuj\u0105c nast\u0119puj\u0105ce komendy:\u00a0<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nnpm install -g @angular\/cli@latest\nng new my-first-project\u2013angular-version-17\n<\/pre><\/div>\n\n\n<p>Po utworzeniu i uruchomieniu nowego projektu, mo\u017cemy korzysta\u0107 z nowoczesnych dobrodziejstw.<\/p>\n\n\n\n<p>Ca\u0142y <strong><em>control flow <\/em><\/strong>nowego podej\u015bcia zaprezentuj\u0119 na przyk\u0142adzie prostego widoku, na kt\u00f3rym mamy informacj\u0119 o nowym pracowniku.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image1.png\"><img decoding=\"async\" width=\"426\" height=\"161\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image1.png\" alt=\"nowy pracownik\" class=\"wp-image-26984\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image1.png 426w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image1-300x113.png 300w\" sizes=\"(max-width: 426px) 100vw, 426px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 1 Informacja o nowym pracowniku<\/figcaption><\/figure>\n\n\n\n<p>Po naci\u015bni\u0119ciu przycisku \u201eMore information\u201d, zostan\u0105 pokazane dodatkowe informacje na temat pracownika, a wszystko oparte jest na 3 dyrektywach:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>*ngIf,<\/li>\n\n\n\n<li>*ngFor,<\/li>\n\n\n\n<li>*ngSwitch.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image2-1.png\"><img decoding=\"async\" width=\"427\" height=\"447\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image2-1.png\" alt=\"Dodatkowe informacje o pracowniku\" class=\"wp-image-26987\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image2-1.png 427w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image2-1-287x300.png 287w\" sizes=\"(max-width: 427px) 100vw, 427px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 2 Dodatkowe informacje o pracowniku<\/figcaption><\/figure>\n\n\n\n<p>No to zaczynajmy \ud83d\ude42\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>*ngIf \/ @if @else<\/strong><\/h2>\n\n\n\n<p>Na pocz\u0105tku przedstawi\u0119 najprostszy spos\u00f3b wy\u015bwietlania informacji w aplikacji, czyli nasz\u0105 dyrektyw\u0119 *ngIf. S\u0142u\u017cy ona do pokazywania lub ukrywania informacji w templatce.&nbsp;<\/p>\n\n\n\n<p>W naszym przyk\u0142adzie na pocz\u0105tku ukrywamy, a p\u00f3\u017aniej pokazujemy informacj\u0119 o wybranym pracowniku:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&amp;lt;!-- Old Syntax --&gt;\n&amp;lt;div *ngIf=&quot;isInfoVisible; else noInformation&quot;&gt;\n    &amp;lt;p class=&quot;age&quot;&gt;&amp;lt;b&gt;Age:&amp;lt;\/b&gt; {{user.age}}&amp;lt;\/p&gt;\n    &amp;lt;p&gt;&amp;lt;b&gt;Job position:&amp;lt;\/b&gt; {{user.jobPosition}}&amp;lt;\/p&gt;\n    &amp;lt;p class=&quot;header-skill&quot;&gt;Skills:&amp;lt;\/p&gt;\n    &amp;lt;ul class=&quot;skills&quot;&gt;\n        &amp;lt;li *ngFor=&quot;let skill of user.skills&quot;&gt;{{skill}}&amp;lt;\/li&gt;\n    &amp;lt;\/ul&gt;\n &amp;lt;\/div&gt;\n\n&amp;lt;ng-template #noInformation&gt;\n    &amp;lt;p class=&quot;no-information&quot;&gt;\nShow more information about {{user.fName}} {{user.lName}}\n    &amp;lt;\/p&gt;\n&amp;lt;\/ng-template&gt;\n<\/pre><\/div>\n\n\n<p>Nowa sk\u0142adnia jest ca\u0142kiem przyjazna dla developera, gdy\u017c wszystko zamyka si\u0119 w konstrukcji @if @else oraz nawiasach klamrowych.&nbsp;<\/p>\n\n\n\n<p>Ponadto, pozbywamy si\u0119 dodatkowego kodu jak <strong><em>ng-template<\/em><\/strong>, a ca\u0142a logika zaczyna by\u0107 troch\u0119 oddzielona od tag\u00f3w HTML.&nbsp;<\/p>\n\n\n\n<p>Nic nie stoi na przeszkodzie, aby doda\u0107 wi\u0119cej warunk\u00f3w np.: @if\u00a0\u00a0 @else if\u00a0\u00a0 @else.\u00a0<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&amp;lt;!-- New Syntax --&gt;\n@if (isInfoVisible) {\n    &amp;lt;div&gt;\n        &amp;lt;p class=&quot;age&quot;&gt;&amp;lt;b&gt;Age:&amp;lt;\/b&gt; {{user.age}}&amp;lt;\/p&gt;\n        &amp;lt;p&gt;&amp;lt;b&gt;Job position:&amp;lt;\/b&gt; {{user.jobPosition}}&amp;lt;\/p&gt;\n        &amp;lt;p class=&quot;header-skill&quot;&gt;Skills:&amp;lt;\/p&gt;\n        &amp;lt;ul class=&quot;skills&quot;&gt;\n            &amp;lt;li *ngFor=&quot;let skill of user.skills&quot;&gt;{{skill}}&amp;lt;\/li&gt;\n        &amp;lt;\/ul&gt;\n    &amp;lt;\/div&gt;\n} @else {\n    &amp;lt;p class=&quot;no-information&quot;&gt;\nShow more information about {{user.fName}} {{user.lName}}\n    &amp;lt;\/p&gt;\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Lista umiej\u0119tno\u015bci pracownika, czyli *ngFor vs. @for @empty\u00a0<\/strong><\/h2>\n\n\n\n<p>Je\u017celi chodzi o wy\u015bwietlanie list oraz iteracj\u0119 po ka\u017cdym elemencie, to tutaj bardzo przydatn\u0105 dyrektyw\u0105 jest *ngFor, kt\u00f3ra pozwala na wy\u015bwietlanie dynamicznych informacji.\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image3-1.png\"><img decoding=\"async\" width=\"430\" height=\"184\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image3-1.png\" alt=\"Wy\u015bwietlanie dynamicznych informacji\" class=\"wp-image-26990\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image3-1.png 430w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image3-1-300x128.png 300w\" sizes=\"(max-width: 430px) 100vw, 430px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 3 Wy\u015bwietlanie dynamicznych informacji<\/figcaption><\/figure>\n\n\n\n<p>W dotychczasowym podej\u015bciu wykonywali\u015bmy p\u0119tl\u0119 *ngFor bezpo\u015brednio na iterowany elemencie.\u00a0<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&amp;lt;!-- Old Syntax --&gt;\n    &amp;lt;p class=&quot;header-skill&quot;&gt;Skills:&amp;lt;\/p&gt;\n    &amp;lt;ul class=&quot;skills&quot;&gt;\n        &amp;lt;li *ngFor=&quot;let skill of user.skills&quot;&gt;{{skill}}&amp;lt;\/li&gt;\n    &amp;lt;\/ul&gt;\n<\/pre><\/div>\n\n\n<p>W nowym podej\u015bciu zosta\u0142a wprowadzona p\u0119tla @for. Istotn\u0105 zmian\u0105, kt\u00f3ra bardzo dobrze wp\u0142ywa na performance aplikacji, jest fakt, \u017ce w nowej sk\u0142adni musimy przekaza\u0107 wymagan\u0105 metod\u0119 trackBy. Przypomn\u0119, \u017ce przy *ngFor tworzyli\u015bmy tak\u0105 metod\u0105 w pliku *.ts, i nie by\u0142o to wymagane, zale\u017ca\u0142o od front-end developera.\u00a0<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&amp;lt;!-- New Syntax --&gt;\n    &amp;lt;p class=&quot;header-skill&quot;&gt;Skills:&amp;lt;\/p&gt;\n    &amp;lt;ul class=&quot;skills&quot;&gt;\n        @for (skill of user.skills; track $index) {\n            &amp;lt;li&gt;{{skill}}&amp;lt;\/li&gt;\n        } @empty {\n            &amp;lt;li&gt;No skills on the list&amp;lt;\/li&gt;\n        }\n    &amp;lt;\/ul&gt;\n<\/pre><\/div>\n\n\n<p>Dodatkow\u0105 zalet\u0105 nowego podej\u015bcia jest @empty, kt\u00f3ra pokazuje informacj\u0119, je\u017celi nasza lista jest pusta. Wcze\u015bniej nie mieli\u015bmy takiej mo\u017cliwo\u015bci i trzeba by\u0142o wykona\u0107 kolejne operacje razem z *ngIf, aby uzyska\u0107 podobny efekt.\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image4-1.png\"><img decoding=\"async\" width=\"432\" height=\"70\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image4-1.png\" alt=\"Informacja, gdy lista jest pusta\" class=\"wp-image-26993\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image4-1.png 432w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image4-1-300x49.png 300w\" sizes=\"(max-width: 432px) 100vw, 432px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 4 Informacja, gdy lista jest pusta<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Nowa ods\u0142ona *ngSwitch<\/strong><\/h2>\n\n\n\n<p>Ostatni\u0105 dyrektyw\u0105 i now\u0105 sk\u0142adni\u0105, kt\u00f3r\u0105 chcia\u0142bym przedstawi\u0107 jest *ngSwitch oraz @Switch @case. S\u0142u\u017cy ona do wy\u015bwietlania wielu informacji w zale\u017cno\u015bci od spe\u0142nionego warunku. W naszym widoku mamy do\u015bwiadczenie wybranego pracownika.\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image5-1.png\"><img decoding=\"async\" width=\"429\" height=\"72\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image5-1.png\" alt=\"Wy\u015bwietlanie wielu informacji\" class=\"wp-image-26996\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image5-1.png 429w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/image5-1-300x50.png 300w\" sizes=\"(max-width: 429px) 100vw, 429px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 5 Wy\u015bwietlanie wielu informacji<\/figcaption><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n &amp;lt;!-- Old Syntax --&gt;\n    &amp;lt;p&gt;\n        &amp;lt;b&gt;Experience: &amp;lt;\/b&gt;\n        &amp;lt;ng-container &#x5B;ngSwitch]=&quot;user.experience&quot;&gt;\n            &amp;lt;span *ngSwitchCase=&quot;experience.Small&quot;&gt;\n                Junior Software Engineer\n            &amp;lt;\/span&gt;\n            &amp;lt;span *ngSwitchCase=&quot;experience.Medium&quot;&gt;\n                Regular Software Engineer\n            &amp;lt;\/span&gt;\n            &amp;lt;span *ngSwitchCase=&quot;experience.Big&quot;\n            &gt;Senior Software Engineer\n        &amp;lt;\/span&gt;\n            &amp;lt;span *ngSwitchDefault&gt;Intern&amp;lt;\/span&gt;\n        &amp;lt;\/ng-container&gt;\n    &amp;lt;\/p&gt;\n<\/pre><\/div>\n\n\n<p>W nowej sk\u0142adni, podobnie jak wcze\u015bniej, mamy oddzielenie logiki od tag\u00f3w HTML, przez co kod jest znacznie czytelniejszy. Je\u017celi \u017cadna warto\u015b\u0107 nie pasuje do naszego, mo\u017cemy skorzysta\u0107 z wersji @default, podobnie jak by\u0142o w starej sk\u0142adni *ngSwitchDefault.\u00a0<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&amp;lt;!-- New Syntax --&gt;\n    &amp;lt;p&gt;\n        &amp;lt;b&gt;Experience: &amp;lt;\/b&gt;\n        @switch (user.experience) {\n            @case (experience.Small) {\n                &amp;lt;span&gt;Junior Software Engineer&amp;lt;\/span&gt;\n            }\n            @case (experience.Medium) {\n                &amp;lt;span&gt;Regular Software Engineer&amp;lt;\/span&gt;\n            }\n            @case (experience.Big) {\n                &amp;lt;span&gt;Senior Software Engineer&amp;lt;\/span&gt;\n            }\n            @default { &amp;lt;span&gt;Intern&amp;lt;\/span&gt; }\n        }\n    &amp;lt;\/p&gt;\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Migracja<\/strong><\/h2>\n\n\n\n<p>Je\u017celi pracujemy w projekcie z ni\u017csz\u0105 wersj\u0105, a nast\u0119pnie chcemy zaktualizowa\u0107 go do wersji 17-tej, mo\u017cemy skorzysta\u0107 tak\u017ce z dodatkowej instrukcji, kt\u00f3ra pozwoli nam na zmian\u0119 dotychczasowej sk\u0142adni na nowy control-flow.\u00a0 W tym celu wystarczy u\u017cy\u0107 instrukcji w terminalu:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nng g @angular\/core:control-flow-migration\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Sk\u0142adnia z @, czy jednak powinni\u015bmy zosta\u0107 przy dyrektywach?<\/strong><\/h2>\n\n\n\n<p>Team Angulara, wprowadzaj\u0105c now\u0105 sk\u0142adni\u0119 dla widok\u00f3w, nie zrezygnowa\u0142 z istniej\u0105cych dyrektyw. A wi\u0119c tworz\u0105c nowy projekt w wersji 17. Angulara, mo\u017cemy korzysta\u0107 z obu opcji, w zale\u017cno\u015bci od naszych upodoba\u0144. Kt\u00f3r\u0105 wersj\u0119 wybra\u0107 i kt\u00f3ra jest lepsza? Odpowied\u017a pozostawiam do indywidualnej oceny ka\u017cdego front-end developera albo do zespo\u0142u, kt\u00f3ry pracuj\u0105 z aplikacj\u0105 \ud83d\ude0a<\/p>\n\n\n\n<p>Nowa sk\u0142adnia ma za zadanie <strong>oddzieli\u0107 w widoczny spos\u00f3b<\/strong> sk\u0142adni\u0119 logiki od element\u00f3w HTML. Drugim istotnym powodem jest wprowadzenie komponent\u00f3w opartych na sygna\u0142ach. Maj\u0105 one now\u0105 detekcj\u0119 zmian bez zone.js \u2013 w Angular jest to NgZone. Obecne dyrektywy oparte s\u0105 na zone.js i mog\u0142yby nie zadzia\u0142a\u0107 w komponentach bez zone.\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Ja osobi\u015bcie <strong>polubi\u0142em now\u0105 sk\u0142adni\u0119<\/strong>, poniewa\u017c jest dla mnie <strong>czytelniejsza<\/strong> oraz, jak wspomnia\u0142em, oddziela logik\u0119 od tag\u00f3w HTML. Ponadto, dodaje dodatkowe funkcjonalno\u015bci jak @empty czy wymuszony trackBy.&nbsp;Z ch\u0119ci\u0105 b\u0119d\u0119 z niej korzysta\u0142 przy kolejnych projektach.<\/p>\n\n\n\n<p>Ca\u0142y kod, kt\u00f3ry zosta\u0142 przedstawiony w tym artykule, mo\u017cecie pobra\u0107 z mojego repozytorium i sprawdzi\u0107, jak to dzia\u0142a. Zach\u0119cam do instalowania nowej wersji Angulara lub podbicia paczek do wersji 17. i korzystania z nowo\u015bci, kt\u00f3re powinny nam <strong>u\u0142atwi\u0107<\/strong>, a czasami tak\u017ce <strong>przyspieszy\u0107<\/strong>, prac\u0119 nad rozwijanymi aplikacjami.\u00a0<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p><strong><a href=\"https:\/\/github.com\/marbogfront\/control-flow-angular-17\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Link do repozytorium projektu<\/a><\/strong><\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuje Ci\u0119 Angular, zajrzyj r\u00f3wnie\u017c <a href=\"https:\/\/sii.pl\/blog\/en\/search\/angular\/\" target=\"_blank\" aria-label=\"do innych artyku\u0142\u00f3w naszych ekspert\u00f3w (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">do innych artyku\u0142\u00f3w naszych ekspert\u00f3w<\/a>. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wraz z nadej\u015bciem kolejnej wersji Angulara (wersja 17.) w listopadzie 2023 roku, pojawi\u0142y si\u0119 nowe funkcjonalno\u015bci do pracy z widokami &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/angular-17-jak-pracowac-z-nowymi-widokami\/\">Continued<\/a><\/p>\n","protected":false},"author":270,"featured_media":27000,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[2427,1546,1512,867],"class_list":["post-26982","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-digital","tag-przeglad-narzedzi","tag-poradnik","tag-angular"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/Angular-17-\u2013-jak-pracowac-z-nowymi-widokami.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/26982"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/270"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=26982"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/26982\/revisions"}],"predecessor-version":[{"id":27214,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/26982\/revisions\/27214"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/27000"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=26982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=26982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=26982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}