{"id":27050,"date":"2020-04-08T00:00:00","date_gmt":"2020-04-07T22:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=27050"},"modified":"2021-01-13T09:40:08","modified_gmt":"2021-01-13T08:40:08","slug":"angular-9-cosa-cambia-e-perche-usarlo","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/","title":{"rendered":"Angular 9: cosa cambia e perch\u00e9 usarlo"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"27052\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/attachment\/top00-1\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1.png?fit=1024%2C608&amp;ssl=1\" data-orig-size=\"1024,608\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"top00-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-27052\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sappiamo che, nel nostro lavoro, il continuo aggiornamento dei framework e strumenti di sviluppo \u00e8 fonte di gioie e dolori. In questo articolo, vedremo quali sono le novit\u00e0 di Angular 9, perch\u00e9 \u00e8 una versione importante e quanto valga la pena provarla subito.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La pubblicazione della versione 9 era prevista per Novembre 2019, ma l\u2019annuncio ufficiale di&nbsp;<a href=\"https:\/\/blog.angular.io\/version-9-of-angular-now-available-project-ivy-has-arrived-23c97b63cfa3\" target=\"_blank\" rel=\"noreferrer noopener\">Stephen Fluin<\/a>&nbsp;\u00e8 arrivato solo il 6 Febbraio. Ci\u00f2 ha suscitato molte critiche dovute al fatto che il team di Angular porta con s\u00e9 una naturale diffidenza, erede di quella transizione&nbsp;<em>drammatica<\/em>&nbsp;da Angular.js alla versione 2.0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di entrare nel dettaglio, vi segnalo che il 26 Marzo \u00e8 stata pubblicata anche la versione 9.1 che utilizzer\u00f2 in questo articolo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"404\" height=\"352\" data-attachment-id=\"27055\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/attachment\/image01-4\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image01-4.png?fit=404%2C352&amp;ssl=1\" data-orig-size=\"404,352\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image01-4\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image01-4.png?fit=404%2C352&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image01-4.png?resize=404%2C352&#038;ssl=1\" alt=\"\" class=\"wp-image-27055\" srcset=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image01-4.png?w=404&amp;ssl=1 404w, https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image01-4.png?resize=300%2C261&amp;ssl=1 300w\" sizes=\"auto, (max-width: 404px) 100vw, 404px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ci rendiamo conto dell\u2019importanza della versione 9 quando scopriamo che introduce per default&nbsp;<strong>Ivy,&nbsp;<\/strong>una nuova pipeline di compilazione e rendering (disponibile per esperimenti gi\u00e0 dalla versione 8).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Perch\u00e9 questa riscrittura? Prima di tutto, il traffico web proviene in gran parte da smartphone e tablet. La sfida dei programmatori front-end \u00e8 quella di caricare un\u2019applicazione web il pi\u00f9 velocemente possibile, considerando l\u2019instabilit\u00e0 delle connessioni internet a nostra disposizione. Il primo passo \u00e8 ridurre la dimensione del bundle prodotto dal framework, e Ivy raggiunge questo risultato generando meno codice per ciascun componente e utilizzando un algoritmo chiamato&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/webpack.js.org\/guides\/tree-shaking\/\" target=\"_blank\">tree-shaking<\/a>&nbsp;che rimuove le sezioni di Angular inutilizzate. I risultati sono importanti per applicazioni piccole e grandi mentre quelle di dimensione media non hanno ancora riduzioni sensibili.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"680\" height=\"386\" data-attachment-id=\"27057\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/attachment\/image02-3-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-3.png?fit=680%2C386&amp;ssl=1\" data-orig-size=\"680,386\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image02-3\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-3.png?fit=680%2C386&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-3.png?resize=680%2C386&#038;ssl=1\" alt=\"\" class=\"wp-image-27057\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-3.png 680w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-3-480x272.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 680px, 100vw\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Nuova esperienza di Debug<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Creiamo un nuovo progetto utilizzando il comando ng new che si arricchisce di una opzione &#8211;minimal che rimuove tutti i file necessari per il testing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ng new my-first-demo--minimal --style=css<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Immaginiamo di avere un componente padre chiamato ProductListComponent e un componente figlio chiamato ProductDetails. A partire da questa situazione, vediamo come cambia l\u2019esperienza di debug in Angular sfruttando i developer tool di Chrome.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Selezioniamo nel panel components il nostro componente padre e spostiamoci nella console.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"637\" data-attachment-id=\"27060\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/attachment\/image04-3\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image04-3.png?fit=1501%2C933&amp;ssl=1\" data-orig-size=\"1501,933\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image04-3\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image04-3.png?fit=1024%2C637&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image04-3.png?resize=1024%2C637&#038;ssl=1\" alt=\"\" class=\"wp-image-27060\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image04-3-980x609.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image04-3-480x298.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dalla console possiamo accedere a un nuovo oggetto chiamato&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/angular.io\/api\/core\/global#entry-point-exports\" target=\"_blank\"><strong>ng<\/strong><\/a><strong>,&nbsp;<\/strong>pensato per migliorare l\u2019esperienza di debug. Partiamo associando a una variabile l\u2019elemento selezionato disponibile mediante l\u2019alias $0. Le api di ng restituiscono il componente mediante ng.getContext($0).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"100\" data-attachment-id=\"27062\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/attachment\/image05-3\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image05-3.png?fit=1000%2C100&amp;ssl=1\" data-orig-size=\"1000,100\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image05-3\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image05-3.png?fit=1000%2C100&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image05-3.png?resize=1000%2C100&#038;ssl=1\" alt=\"\" class=\"wp-image-27062\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image05-3.png 1000w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image05-3-980x98.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image05-3-480x48.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1000px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Possiamo clonare il primo prodotto, modificarlo e visualizzare le differenze con un console.table<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"427\" data-attachment-id=\"27064\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/attachment\/image06-3\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image06-3.png?fit=1000%2C427&amp;ssl=1\" data-orig-size=\"1000,427\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image06-3\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image06-3.png?fit=1000%2C427&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image06-3.png?resize=1000%2C427&#038;ssl=1\" alt=\"\" class=\"wp-image-27064\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image06-3.png 1000w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image06-3-980x418.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image06-3-480x205.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1000px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">e, infine, invocare ng.applyChanges($0) per eseguire la&nbsp;<strong>change detection<\/strong>&nbsp;in Angular. Volendo, possiamo invocare anche i metodi del componente selezionato, per simulare la pressione di un bottone.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"251\" data-attachment-id=\"27067\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/attachment\/image07-2-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image07-2.png?fit=498%2C251&amp;ssl=1\" data-orig-size=\"498,251\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image07-2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image07-2.png?fit=498%2C251&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image07-2.png?resize=498%2C251&#038;ssl=1\" alt=\"\" class=\"wp-image-27067\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image07-2.png 498w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image07-2-480x242.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 498px, 100vw\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Type checking<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Typescript permette di identificare i&nbsp;<em>type error<\/em>&nbsp;nel codice ma finora mancava un supporto altrettanto forte nella parte di templating. Esiste, all\u2019interno del file tsconfig.json, un flag chiamato fullTemplateTypeCheck che, nella versione 9 di Angular, \u00e8 impostato a true. Il valore false di tale flag provoca il cosiddetto&nbsp;<em>basic&nbsp;<\/em><strong>type-checking mode<\/strong>. Consideriamo il caso seguente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&lt;app-product-details\n    &#x5B;store]=&quot;user.address.city&quot; &#x5B;product]=&quot;selectedProduct&quot;&gt;\n&lt;\/app-product-details&gt;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Il compilatore controlla che:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>user sia una property della classe component<\/li><li>user sia un oggetto con una propriet\u00e0 address<\/li><li>user.address sia un oggetto con una propriet\u00e0 city<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Nel basic type-checking mode, il compilatore non verifica che il valore di user.address.city sia assegnabile alla input store del componente figlio. Inoltre, non vengono controllate le cosiddette&nbsp;<strong>embedded view<\/strong>, ad esempio *ngIf, *ngFor e gli ng-template. Non vengono neppure controllati i risultati delle pipe e i tipi di $event negli event binding.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando il flag fullTemplateTypeCheck \u00e8 uguale a true, Angular esegue un type checking pi\u00f9 rigoroso. Le embedded view vengono controllate, le pipe hanno il corretto tipo di ritorno e tutte le reference locali alle direttive e pipe hanno il tipo corretto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prendiamo ad esempio il caso di un *ngFor:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&lt;div *ngFor=&quot;let product of products&quot;&gt;\n    &lt;h3&gt;{{config.title}}&lt;\/h2&gt;\n    &lt;span&gt;Store: {{user.address.city}}&lt;\/span&gt;\n&lt;\/div&gt;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">In basic mode, &lt;h3&gt; e &lt;span&gt; non vengono controllati. In modalit\u00e0 full, invece, il compilatore controlla che config e user esistano ma assume un tipo any per esse!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Angular 9 introduce una terza modalit\u00e0 di controllo, chiamata&nbsp;<strong>strict mode<\/strong>. Con essa il framework determina che user nello span \u00e8 di un tipo User e che address \u00e8 un oggetto con una propriet\u00e0 city di tipo string.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lo strict mode \u00e8 accessibile solo con Ivy settando tsconfig.json nel modo seguente<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&quot;angularCompilerOptions&quot;:\n{\n    &quot;strictTemplates&quot;: true,\n    &quot;strictInjectionParameters&quot;: true\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Consideriamo il seguente esempio:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"575\" height=\"215\" data-attachment-id=\"27070\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/attachment\/image08-2-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image08-2.png?fit=575%2C215&amp;ssl=1\" data-orig-size=\"575,215\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image08-2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image08-2.png?fit=575%2C215&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image08-2.png?resize=575%2C215&#038;ssl=1\" alt=\"\" class=\"wp-image-27070\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image08-2.png 575w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image08-2-480x179.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 575px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ho intenzionalmente cambiato il case della propriet\u00e0 id che nella definizione dell\u2019interfaccia \u00e8 invece id. Lasciando il tsconfig.json nella versione originaria<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&quot;angularCompilerOptions&quot;: \n{\n    &quot;fullTemplateTypeCheck&quot;: true,\n    &quot;strictInjectionParameters&quot;: true\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">la compilazione mediante comando ng build viene superata con successo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"556\" data-attachment-id=\"27073\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/attachment\/image09-1\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image09-1.png?fit=1265%2C687&amp;ssl=1\" data-orig-size=\"1265,687\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image09-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image09-1.png?fit=1024%2C556&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image09-1.png?resize=1024%2C556&#038;ssl=1\" alt=\"\" class=\"wp-image-27073\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image09-1-1024x556.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image09-1-980x532.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image09-1-480x261.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Passando invece in strict mode, la compilazione fallisce.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"527\" data-attachment-id=\"27075\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/attachment\/image10-1\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image10-1.png?fit=1313%2C676&amp;ssl=1\" data-orig-size=\"1313,676\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image10-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image10-1.png?fit=1024%2C527&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image10-1.png?resize=1024%2C527&#038;ssl=1\" alt=\"\" class=\"wp-image-27075\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image10-1-980x505.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image10-1-480x247.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>La compilazione AOT<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Abituati a lanciare le nostre app con il comando ng serve, quante volte ci siamo trovati di fronte ad errori di compilazione al momento di andare in produzione eseguendo il comando ng build &#8211;prod? Quello che succedeva era che con quest\u2019ultima opzione veniva avviata la compilazione AOT (Ahead-Of-Time).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ma perch\u00e9 abbiamo bisogno di una compilazione? Cosa viene compilato? Quando avviene? Il compilatore Angular pu\u00f2 essere invocato a runtime (ossia nel browser dell\u2019utente) o a build-time nel processo di build. Si \u00e8 sempre parlato, infatti, della portabilit\u00e0 di Angular, ossia del fatto che il framework possa essere eseguito su qualsiasi piattaforma con una VM Javascript.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel primo caso (Just-In-Time Compilation) il flusso tipico \u00e8:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>sviluppo del codice in Typescript<\/li><li>compilazione dell\u2019applicazione con&nbsp;<a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/compiler-options.html\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>tsc<\/strong><\/a><\/li><li>bundling, minification e deployment<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019utente apre l\u2019app nel suo browser innescando i seguenti passi:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>download di tutti gli asset Javascript<\/li><li>bootstrap di Angular<\/li><li>generazione del Javascript per ciascun componente dell\u2019applicazione<\/li><li>rendering dell\u2019applicazione<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Nella compilazione Ahead-Of-Time i passi sono invece i seguenti:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>sviluppo del codice in Typescript<\/li><li>compilazione dell\u2019applicazione con&nbsp;<a href=\"https:\/\/medium.com\/angular-in-depth\/inside-ivy-exploring-the-new-angular-compiler-ebf85141cee1\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>ngc<\/strong><\/a><\/li><li>bundling, minification e deployment<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Quello che accade invece quando l\u2019utente apre l\u2019app nel suo browser \u00e8:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>download di tutti gli asset Javascript<\/li><li>bootstrap di Angular<\/li><li>rendering dell\u2019applicazione<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La user experience \u00e8 quindi migliore e pi\u00f9 veloce perch\u00e9 un codice Javascript pi\u00f9 efficiente viene generato in fase di build e il browser deve solo occuparsi del rendering. I&nbsp;<a href=\"https:\/\/angular.io\/guide\/aot-compiler\" target=\"_blank\" rel=\"noreferrer noopener\">dettagli<\/a>&nbsp;di come funzioni la compilazione AOT vanno oltre gli scopi di questo articolo, ma vi confesso che trovo questo mondo davvero affascinante. Con Angular 9, la compilazione AOT con Ivy \u00e8 cos\u00ec veloce ed efficiente che viene utilizzata anche con ng serve per le build in fase di sviluppo!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dependency Injection (DI)<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Altre novit\u00e0 importanti riguardano la Dependency Injection. La DI \u00e8 cablata nel framework di Angular e usata ovunque per fornire a tutti i componenti i servizi di cui hanno bisogno. I componenti Angular consumano servizi iniettati attraverso il costruttore.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"502\" height=\"242\" data-attachment-id=\"27078\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/attachment\/image11-1\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image11-1.png?fit=502%2C242&amp;ssl=1\" data-orig-size=\"502,242\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image11-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image11-1.png?fit=502%2C242&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image11-1.png?resize=502%2C242&#038;ssl=1\" alt=\"\" class=\"wp-image-27078\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image11-1.png 502w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image11-1-480x231.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 502px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Qualsiasi classe pu\u00f2 diventare un servizio. Se facciamo precedere la sua definizione da una decorazione @Injectable() possiamo modificare i metadati necessari ad Angular per iniettarla come dipendenza in un componente rispetto a quelli di default. @Injectable() serve ad indicare anche che una classe ha una dipendenza.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Angular nel suo processo di bootstrap crea un&nbsp;<strong>injector<\/strong>&nbsp;disponibile a tutta l\u2019applicazione. L\u2019injector crea le dipendenze e gestisce in un&nbsp;<strong>container<\/strong>&nbsp;tutte le istanze delle dipendenze da riutilizzare. Infine, un&nbsp;<strong>provider<\/strong>&nbsp;istruisce l\u2019injector su come ottenere o creare una dipendenza.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consideriamo come esempio il seguente costruttore di un componente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nconstructor(private service: ProductsService) { }\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Quando Angular scopre che un componente dipende da un servizio, controlla anzitutto che l\u2019injector abbia una istanza disponibile di quel servizio. Se non c\u2019\u00e8, ne viene creata una usando il provider registrato che viene aggiunta al container prima di passarla al componente.<br>Ogni servizio deve avere almeno un provider registrato a livello applicativo. Il provider pu\u00f2 essere contenuto nei metadati del servizio (il decoratore @Injectable()) e in tal caso il servizio \u00e8 disponibile ovunque nell\u2019applicazione. In alternativa possiamo registrare dei provider a livello di modulo o componente (nei metadati di @NgModule o @Component).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per default, la CLI di Angular con il comando ng generate service registra un provider col&nbsp;<strong>root injector<\/strong><em>,&nbsp;<\/em>ossia viene creata una singola istanza condivisa del servizio e la inietta in ogni classe che ne faccia richiesta:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n@Injectable({\n  providedIn: &#039;root&#039;\n})\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">L\u2019uso del root injector presenta anche il vantaggio di rimuovere tale istanza se non viene usata in nessun componente. All\u2019interno di uno specifico modulo, possiamo registrare un provider che fornisca la stessa istanza a tutti i componenti del modulo stesso.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n@NgModule({\n  providers: &#x5B;\n  ProductsService\n  ],\n  ...\n})\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Quando registriamo un provider a livello di componente, creiamo una nuova istanza del servizio per ciascuna nuova istanza del componente.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n@Component({\n\u00a0\u00a0selector: &#039;app-products-list&#039;,\n\u00a0\u00a0templateUrl: &#039;products-list.component.html&#039;,\n\u00a0\u00a0providers: &#x5B;ProductsService]\n})\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">La novit\u00e0 di Angular 9 \u00e8 che quando creiamo un servizio @Injectable abbiamo due nuove opzioni per&nbsp;<strong>providedIn<\/strong>: platform ed any. Secondo la documentazione, l\u2019opzione platform rende un servizio disponibile come singleton con un injector che \u00e8 condiviso da tutte le applicazioni su una pagina. Non dimenticate, infatti, che la vostra pagina index.html della SPA pu\u00f2 in principio ospitare pi\u00f9 di un\u2019applicazione Angular! Riusciamo in questo modo a condividere un servizio superando i famosi e invalicabili&nbsp;<strong>application boundaries<\/strong>!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019opzione&nbsp;<strong>providedIn: any&nbsp;<\/strong>funziona in maniera tale per cui il servizio verr\u00e0 fornito in ogni modulo in cui viene usato. Questo implica che ogni modulo caricato col lazy-loading (altra importante funzionalit\u00e0 offerta a partire da Angular 8) ha una istanza propria del servizio. Invece i moduli caricati normalmente (modalit\u00e0&nbsp;<strong>eager<\/strong>) continueranno a condividere la singola istanza fornita dall\u2019 injector del modulo root. Questa nuova opportunit\u00e0 per i moduli lazy-loaded \u00e8 stata pensare per evitare che i moduli non interferiscano tra loro generando side-effect.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Lazy-Loading Components<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Veniamo, infine, all\u2019ultima novit\u00e0 che intendo mostrarvi. Siamo abituati a pensare ai moduli come cittadini di prima classe, anzi come il blocco principale di una qualsiasi applicazione Angular. In essi dichiariamo i componenti, le direttive, le pipe e i servizi. Un\u2019applicazione non pu\u00f2 esistere senza almeno un modulo. Ivy parte da un approccio diverso. Un componente pu\u00f2 esistere senza un modulo. Tale concetto \u00e8 chiamato&nbsp;<strong>locality<\/strong>: tutti i metadati necessari sono locali al componente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Usiamo la ng CLI per generare un componente chiamato FirstLazy utilizzando le seguenti opzioni:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ng g c first-lazy --flat --skip-import --skip-selector<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo un unico file in cui \u00e8 dichiarata la class FirstLazyComponent che non ha neppure un selector.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nimport { Component} from &#039;@angular\/core&#039;;\n@Component({\n    template:\n      &lt;p&gt;\n        first-lazy works!\n      &lt;\/p&gt;\n    `\n})\nexport class FirstLazyComponent {\n    constructor() { }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Il componente cos\u00ec creato non \u00e8 registrato neppure nel root module (app.module.ts).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come possiamo allora caricarlo? Anzitutto nell\u2019&nbsp;<strong>AppComponent<\/strong>&nbsp;inseriamo un bottone al cui click associamo una function definita nel codice.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n@Component({\n    selector: &#039;app-root&#039;,\n    template: `\n      &lt;div&gt;\n          &lt;div&gt;My first lazy component &lt;\/div&gt;\n          &lt;button class=&quot;btn btn-info&quot; (click)=&quot;showLazy()&quot;&gt;Create&lt;\/button&gt;\n      &lt;\/div&gt;\n    `\n})\nexport class AppComponent {\n    title = &#039;my-first-demo&#039;;\n    showLazy(){\n    }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Nel costruttore possiamo iniettare una istanza di&nbsp;<strong>ViewContainerRef.&nbsp;<\/strong>Si tratta di un contenitore in cui possiamo aggiungere una o pi\u00f9 view ad un componente. Iniettiamo anche un altro servizio chiamato&nbsp;<strong>ComponentFactoryResolver&nbsp;<\/strong>che permette di creare un componente da codice.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nexport class AppComponent {\n    title = &#039;my-first-demo&#039;;\n    constructor(private cfr: ComponentFactoryResolver,\n                private viewContainerRef: ViewContainerRef) {\n    }\n    showLazy(){\n    }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Nel metodo showLazy(), anzitutto svuotiamo il contenitore dalla presenza di eventuali componenti. Importiamo in maniera asincrona il codice del componente e lo creiamo utilizzando il ComponentFactoryResolver.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nasync showLazy(){\n\u00a0\u00a0\u00a0\u00a0this.viewContainerRef.clear();\n\u00a0\u00a0\u00a0\u00a0const { FirstLazyComponent } = await import(&#039;.\/first-lazy.component&#039;);\n\u00a0\u00a0\u00a0\u00a0this.viewContainerRef.createComponent(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.cfr.resolveComponentFactory(FirstLazyComponent)\n\u00a0\u00a0\u00a0\u00a0);\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Abbiamo un\u2019alternativa che ci da maggiore controllo sul container. Usiamo un ng-container a cui associamo una&nbsp;<strong>template reference variable<\/strong>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ntemplate: `\n\u00a0\u00a0\u00a0\u00a0&lt;div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div&gt;My first lazy component &lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;button class=&quot;btn btn-info&quot; (click)=&quot;showLazy()&quot;&gt;Create&lt;\/button&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=&quot;myBackground&quot;&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;ng-container #myContainer&gt;&lt;\/ng-container&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Nel codice della classe usiamo l\u2019annotazione @ViewChild e la impostiamo in maniera tale che il ViewContainerRef punti al nostro #myContainer. Modifichiamo quindi il codice del click del bottone.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nexport class AppComponent {\n    title = &#039;my-first-demo&#039;;\n  \n    @ViewChild(&#039;myContainer&#039;, {read: ViewContainerRef}) myContainer: ViewContainerRef;\n   \n    constructor( private cfr: ComponentFactoryResolver) {}\n  \n    async showLazy(){\n        this.myContainer.clear();\n        const { FirstLazyComponent } = await import(&#039;.\/first-lazy.component&#039;);\n        this.myContainer.createComponent(\n          this.cfr.resolveComponentFactory(FirstLazyComponent)\n        );\n    }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Nel codice del componente lazy possiamo inserire una propriet\u00e0 (l\u2019ho chiamata message), e crearne un\u2019istanza passando come parametro anche un Injector iniettato nell\u2019 AppComponent. Su quest\u2019istanza possiamo settare la propriet\u00e0 message utilizzando un nostro servizio (ProductsService).<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nexport class AppComponent {\n    title = &#039;my-first-demo&#039;;\n  \n    @ViewChild(&#039;myContainer&#039;, {read: ViewContainerRef}) myContainer: ViewContainerRef;\n   \n    constructor(private cfr: ComponentFactoryResolver,\n            private injector: Injector,\n            private myservice: ProductsService) {\n    }\n  \nasync showLazy(){\n    this.myContainer.clear();\n    const { FirstLazyComponent } = await import(&#039;.\/first-lazy.component&#039;);\n    const {instance} = this.myContainer.createComponent(\n        this.cfr.resolveComponentFactory(FirstLazyComponent), null, this.injector);\n    instance.message = this.myservice.message();\n    }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Verifichiamo nelle attivit\u00e0 di rete l\u2019effettivo caricamento del file del lazy component.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"930\" height=\"433\" data-attachment-id=\"27084\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/attachment\/image14\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image14.png?fit=930%2C433&amp;ssl=1\" data-orig-size=\"930,433\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image14\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image14.png?fit=930%2C433&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image14.png?resize=930%2C433&#038;ssl=1\" alt=\"\" class=\"wp-image-27084\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image14.png 930w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image14-480x223.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 930px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Un lazy component pu\u00f2 a sua volta caricare dei figli che siano essi stessi lazy component. Lo scenario \u00e8 quello di poter gestire feature nella nostra applicazione senza ricorrere al routing. Perch\u00e9 farlo? Direi per avere un controllo maggiore nel caricamento in applicazione che consumano molte risorse.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inevitabilmente, il nostro componente lazy prima o poi avr\u00e0 bisogno di moduli esterni (pensiamo ad esempio a Material), Ma dove aggiungiamo questi moduli? Non possiamo caricarli in maniera eager nel nostro AppModule, pena un errore di build.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>error TS-998001: 'mat-card' is not a known element:<br>1. If 'mat-card' is an Angular component, then verify that it is part of this module.<br>2. If 'mat-card' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La soluzione \u00e8 quella di aggiungere al file del componente un piccolo modulo senza dichiarazioni di esportazione. Il solo componente che questo modulo dichiarer\u00e0 \u00e8 il FirstLazyComponent.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n@NgModule({\n    declarations: &#x5B;FirstLazyComponent],\n    imports: &#x5B;CommonModule, MatCardModule]\n})\nclass MyLazyModule {\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Questo trucco, giustificato dal fatto che abbiamo bisogno di un modulo per importare altri moduli, non sar\u00e0 pi\u00f9 necessario nelle prossime versioni di Angular. Il futuro di Angular sar\u00e0 incentrato su Ivy e sul concetto di localit\u00e0, ossia permettere che un componente sia completamente autosufficiente.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Spero che le novit\u00e0 di Angular vi siano piaciute e che possiate utilizzarle nelle vostre future applicazioni. Il codice dell\u2019articolo \u00e8 disponibile al seguente&nbsp;<a href=\"https:\/\/github.com\/sorrentmutie\/articolo-angular-9\" target=\"_blank\" rel=\"noreferrer noopener\">indirizzo<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alla prossima!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Nuova versione del framework front-end targato Google: vediamo quali sono le principali novit\u00e0 introdotte<\/p>\n","protected":false},"author":196716245,"featured_media":27052,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637387,688637389],"class_list":["post-27050","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-angular","tag-web"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Angular 9: cosa cambia e perch\u00e9 usarlo - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular 9: cosa cambia e perch\u00e9 usarlo - Blexin\" \/>\n<meta property=\"og:description\" content=\"Nuova versione del framework front-end targato Google: vediamo quali sono le principali novit\u00e0 introdotte\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2020-04-07T22:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-13T08:40:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i2.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1.png?fit=1024%2C608&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"608\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Salvatore Sorrentino\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salvatore Sorrentino\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-9-cosa-cambia-e-perche-usarlo\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-9-cosa-cambia-e-perche-usarlo\\\/\"},\"author\":{\"name\":\"Salvatore Sorrentino\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/354db2bc97cac71c2ceeca21a92d5bed\"},\"headline\":\"Angular 9: cosa cambia e perch\u00e9 usarlo\",\"datePublished\":\"2020-04-07T22:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-9-cosa-cambia-e-perche-usarlo\\\/\"},\"wordCount\":2013,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-9-cosa-cambia-e-perche-usarlo\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/top00-1.png?fit=1024%2C608&ssl=1\",\"keywords\":[\"Angular\",\"Web\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-9-cosa-cambia-e-perche-usarlo\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-9-cosa-cambia-e-perche-usarlo\\\/\",\"name\":\"Angular 9: cosa cambia e perch\u00e9 usarlo - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-9-cosa-cambia-e-perche-usarlo\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-9-cosa-cambia-e-perche-usarlo\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/top00-1.png?fit=1024%2C608&ssl=1\",\"datePublished\":\"2020-04-07T22:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:08+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/354db2bc97cac71c2ceeca21a92d5bed\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-9-cosa-cambia-e-perche-usarlo\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-9-cosa-cambia-e-perche-usarlo\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-9-cosa-cambia-e-perche-usarlo\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/top00-1.png?fit=1024%2C608&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/top00-1.png?fit=1024%2C608&ssl=1\",\"width\":1024,\"height\":608},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-9-cosa-cambia-e-perche-usarlo\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular 9: cosa cambia e perch\u00e9 usarlo\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/354db2bc97cac71c2ceeca21a92d5bed\",\"name\":\"Salvatore Sorrentino\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g\",\"caption\":\"Salvatore Sorrentino\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/salvatore-sorrentinoblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Angular 9: cosa cambia e perch\u00e9 usarlo - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/","og_locale":"it_IT","og_type":"article","og_title":"Angular 9: cosa cambia e perch\u00e9 usarlo - Blexin","og_description":"Nuova versione del framework front-end targato Google: vediamo quali sono le principali novit\u00e0 introdotte","og_url":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/","og_site_name":"Blexin","article_published_time":"2020-04-07T22:00:00+00:00","article_modified_time":"2021-01-13T08:40:08+00:00","og_image":[{"width":1024,"height":608,"url":"https:\/\/i2.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1.png?fit=1024%2C608&ssl=1","type":"image\/png"}],"author":"Salvatore Sorrentino","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Salvatore Sorrentino","Tempo di lettura stimato":"12 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/"},"author":{"name":"Salvatore Sorrentino","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed"},"headline":"Angular 9: cosa cambia e perch\u00e9 usarlo","datePublished":"2020-04-07T22:00:00+00:00","dateModified":"2021-01-13T08:40:08+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/"},"wordCount":2013,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1.png?fit=1024%2C608&ssl=1","keywords":["Angular","Web"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/","url":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/","name":"Angular 9: cosa cambia e perch\u00e9 usarlo - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1.png?fit=1024%2C608&ssl=1","datePublished":"2020-04-07T22:00:00+00:00","dateModified":"2021-01-13T08:40:08+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1.png?fit=1024%2C608&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1.png?fit=1024%2C608&ssl=1","width":1024,"height":608},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Angular 9: cosa cambia e perch\u00e9 usarlo"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed","name":"Salvatore Sorrentino","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g","caption":"Salvatore Sorrentino"},"url":"https:\/\/blexin.com\/it\/author\/salvatore-sorrentinoblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-1.png?fit=1024%2C608&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-72i","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27050","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716245"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=27050"}],"version-history":[{"count":15,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27050\/revisions"}],"predecessor-version":[{"id":27800,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27050\/revisions\/27800"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/27052"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=27050"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=27050"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=27050"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}