{"id":31283,"date":"2025-02-05T15:15:07","date_gmt":"2025-02-05T14:15:07","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=31283"},"modified":"2025-02-05T15:17:53","modified_gmt":"2025-02-05T14:17:53","slug":"angular-resource-api-la-guida-completa","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/","title":{"rendered":"Angular Resource API: la guida completa"},"content":{"rendered":"\n<p>Il rilascio di <strong>Angular v19<\/strong>, avvenuto poche settimane fa, segna un traguardo importante nella rivoluzione dei signal all&#8217;interno del framework, con le API <strong><a href=\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-signal-inputs-verso-i-signal-components\/\">Input<\/a><\/strong>, <strong><a href=\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-model-inputs-two-way-binding-con-i-signal-inputs\/\">Model<\/a><\/strong>, <strong><a href=\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/la-nuova-funzione-output-di-angular\/\">Output<\/a><\/strong> e <strong><a href=\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-signal-queries-leggi-il-dom-senza-sforzo\/\">Signal Queries<\/a><\/strong> ora ufficialmente <strong>promosse a stabili<\/strong>.<\/p>\n\n\n\n<p>Ma non \u00e8 tutto! Questa versione major introduce anche nuovi strumenti potenti progettati per far progredire ulteriormente la rivoluzione dei signal: la nuova <strong>Resource API<\/strong>.<\/p>\n\n\n\n<p>Come suggerisce il nome, questa nuova <strong>Resource API<\/strong> \u00e8 progettata per semplificare il caricamento di <strong>risorse asincrone<\/strong> sfruttando tutta la potenza dei signal!<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>IMPORTANTE:<\/strong> al momento della scrittura, <strong>la nuova Resource API \u00e8 ancora in fase sperimentale<\/strong>. Ci\u00f2 significa che potrebbe subire modifiche prima di diventare stabile, quindi usatela a vostro rischio. \ud83d\ude05<\/p>\n<\/blockquote>\n<\/blockquote>\n\n\n\n<p>Vediamo insieme in che modo ci pu\u00f2 semplificare la gestione delle risorse asincrone!<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-la-nuova-resource-nbsp-api\">La nuova Resource&nbsp;API<\/h2>\n\n\n\n<p>La maggior parte delle signal API sono sincrone, ma nelle applicazioni del mondo reale \u00e8 fondamentale gestire risorse asincrone, come il recupero dei dati da un server o la gestione delle interazioni dell&#8217;utente in tempo reale.<\/p>\n\n\n\n<p>\u00c8 qui che entra in gioco la nuova <strong>Resource API<\/strong>.<\/p>\n\n\n\n<p>Utilizzando una <strong><code>Resource<\/code><\/strong>, \u00e8 possibile consumare facilmente una <strong>risorsa asincrona<\/strong> tramite i <strong>signal<\/strong>, consentendo di gestire facilmente il recupero dei dati, gli stati di caricamento e far partire una nuova richiesta ogni volta che i parametri del signal associato cambiano.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-la-funzione-resource\">La funzione resource( )<\/h3>\n\n\n\n<p>Il modo pi\u00f9 semplice per creare una <strong><code>Resource<\/code><\/strong> \u00e8 utilizzare la funzione <code><strong>resource()<\/strong><\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { resource, signal } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'@angular\/core'<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> RESOURCE_URL = <span class=\"hljs-string\">'https:\/\/jsonplaceholder.typicode.com\/todos\/'<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">private<\/span> id = signal(<span class=\"hljs-number\">1<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-keyword\">private<\/span> myResource = resource({\n<\/span><\/mark><mark class='shcb-loc'><span>    request: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ id: <span class=\"hljs-keyword\">this<\/span>.id() }),\n<\/span><\/mark><mark class='shcb-loc'><span>    loader: <span class=\"hljs-function\">(<span class=\"hljs-params\">{ <span class=\"hljs-params\">request<\/span> }<\/span>) =&gt;<\/span> fetch(RESOURCE_URL + request.id),\n<\/span><\/mark><mark class='shcb-loc'><span>});\n<\/span><\/mark><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Questa funzione accetta un oggetto di configurazione <code><strong>ResourceOptions<\/strong><\/code> come input, permettendoci di specificare le seguenti propriet\u00e0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong>request<\/strong><\/code>: una <strong>funzione reattiva<\/strong> che determina i parametri utilizzati per eseguire la richiesta alla risorsa asincrona;<\/li>\n\n\n\n<li><code><strong>loader<\/strong><\/code>: una funzione di caricamento che restituisce una <strong><code>Promise<\/code><\/strong> del valore della risorsa, pu\u00f2 essere basata sui parametri forniti dalla funzione <strong><code>request<\/code><\/strong>.<br>Questa \u00e8 l&#8217;unica propriet\u00e0 obbligatoria di <code><strong>ResourceOptions<\/strong><\/code>;<\/li>\n\n\n\n<li><code><strong>equal<\/strong><\/code>: una funzione di uguaglianza utilizzata per confrontare il valore restituito dalla funzione <code><strong>loader<\/strong><\/code>;<\/li>\n\n\n\n<li><code><strong>injector<\/strong><\/code>: sovrascrive l&#8217;<code><strong>Injector<\/strong><\/code> utilizzato dall&#8217;istanza di <code><strong>Resource<\/strong><\/code> per distruggersi quando il componente o il servizio genitore viene distrutto.<\/li>\n<\/ul>\n\n\n\n<p>Grazie a queste configurazioni, possiamo definire facilmente una <strong>dipendenza asincrona<\/strong> che verr\u00e0 consumata in modo efficiente e mantenuta sempre aggiornata.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-ciclo-vita-di-una-resource\">Ciclo vita di una Resource<\/h3>\n\n\n\n<p>Una volta creata una <code><strong>Resource<\/strong><\/code>, la funzione <code><code><strong>loader<\/strong><\/code><\/code> viene eseguita, per poi far partire la richiesta asincrona risultante:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { resource, signal } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"@angular\/core\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> RESOURCE_URL = <span class=\"hljs-string\">\"https:\/\/jsonplaceholder.typicode.com\/todos\/\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> id = signal(<span class=\"hljs-number\">1<\/span>);\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> myResource = resource({\n<\/span><\/span><span class='shcb-loc'><span>  request: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ id: id() }),\n<\/span><\/span><mark class='shcb-loc'><span>  loader: <span class=\"hljs-function\">(<span class=\"hljs-params\">{ <span class=\"hljs-params\">request<\/span> }<\/span>) =&gt;<\/span> fetch(RESOURCE_URL + request.id)\n<\/span><\/mark><span class='shcb-loc'><span>});\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 2 (che significa \"Loading\")<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ogni volta che un signal da cui dipende la funzione <code><strong>request<\/strong><\/code> cambia, la funzione <code><strong>request<\/strong><\/code> viene eseguita di nuovo e, se restituisce nuovi parametri, la funzione <code><code><strong>loader<\/strong><\/code><\/code> viene eseguita per recuperare il valore aggiornato della risorsa.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { resource, signal } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"@angular\/core\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> RESOURCE_URL = <span class=\"hljs-string\">\"https:\/\/jsonplaceholder.typicode.com\/todos\/\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> id = signal(<span class=\"hljs-number\">1<\/span>);\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> myResource = resource({\n<\/span><\/span><span class='shcb-loc'><span>  request: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ id: id() }),\n<\/span><\/span><mark class='shcb-loc'><span>  loader: <span class=\"hljs-function\">(<span class=\"hljs-params\">{ <span class=\"hljs-params\">request<\/span> }<\/span>) =&gt;<\/span> fetch(RESOURCE_URL + request.id)\n<\/span><\/mark><span class='shcb-loc'><span>});\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 2 (che significa \"Loading\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Dopo che la fetch \u00e8 stata completata<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 4 (che significa \"Resolved\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.value()); <span class=\"hljs-comment\">\/\/ Stampa: { \"id\": 1 , ... }<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>id.set(<span class=\"hljs-number\">2<\/span>); <span class=\"hljs-comment\">\/\/ Scatena una nuova richiesta, causando l'esecuzione della funzione loader di nuovo<\/span>\n<\/span><\/mark><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 2 (che significa \"Loading\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Dopo che la fetch \u00e8 stata completata<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 4 (che significa \"Resolved\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.value()); <span class=\"hljs-comment\">\/\/ Stampa: { \"id\": 2 , ... }<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Se non viene fornita una funzione <code><strong>request<\/strong><\/code>, la funzione <code><code><strong>loader<\/strong><\/code><\/code> verr\u00e0 eseguita solo una volta, a meno che la <code><strong>Resource<\/strong><\/code> non venga ricaricata utilizzando il metodo <code><code><strong>reload<\/strong><\/code><\/code> (ne parleremo pi\u00f9 avanti).<\/p>\n\n\n\n<p>Infine, una volta che il componente o il servizio genitore viene distrutto, anche la <code><strong>Resource<\/strong><\/code> viene distrutta, a meno che non sia stato fornito un <code><strong>injector<\/strong><\/code> specifico.<\/p>\n\n\n\n<p>In questi casi, la <code><strong>Resource<\/strong><\/code> rimarr\u00e0 attiva e verr\u00e0 distrutta solo quando l&#8217;<code><strong>injector<\/strong><\/code> fornito verr\u00e0 distrutto a sua volta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-annullare-le-richieste-con-abortsignal\">Annullare le richieste con abortSignal<\/h3>\n\n\n\n<p>Per ottimizzare il recupero dei dati, una <code><strong>Resource<\/strong><\/code> pu\u00f2 annullare le richieste in sospeso se i valori restituiti della funzione <code><strong>request()<\/strong><\/code> cambiano, mentre un valore precedente \u00e8 ancora in fase di caricamento.<\/p>\n\n\n\n<p>Per gestire questi casi, la funzione <code><strong>loader()<\/strong><\/code> fornisce un <code><strong>abortSignal<\/strong><\/code>, che possiamo passare alle nostre richieste, come <code><strong>fetch<\/strong><\/code>. La funzione resta in ascolto dell&#8217;<code><code><strong>abortSignal<\/strong><\/code><\/code> e annulla l&#8217;operazione se questo emette un segnale, garantendo una gestione efficiente delle risorse e prevenendo richieste di rete inutili:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { resource, signal } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"@angular\/core\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> RESOURCE_URL = <span class=\"hljs-string\">\"https:\/\/jsonplaceholder.typicode.com\/todos\/\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> id = signal(<span class=\"hljs-number\">1<\/span>);\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> myResource = resource({\n<\/span><\/span><span class='shcb-loc'><span>  request: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ id: id() }),\n<\/span><\/span><mark class='shcb-loc'><span>  loader: <span class=\"hljs-function\">(<span class=\"hljs-params\">{ <span class=\"hljs-params\">request<\/span>, <span class=\"hljs-params\">abortSignal<\/span> }<\/span>) =&gt;<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>    fetch(RESOURCE_URL + request.id, { signal: abortSignal })\n<\/span><\/mark><span class='shcb-loc'><span>});\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 2 (che significa \"Loading\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Scatena una nuova richiesta, facendo interrompere la precedente richiesta<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Poi la funzione loader viene eseguita di nuovo, generando una nuova richiesta di fetch<\/span>\n<\/span><\/span><mark class='shcb-loc'><span>id.set(<span class=\"hljs-number\">2<\/span>);\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 2 (che significa \"Loading\")<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Sulla base di ci\u00f2, \u00e8 consigliato utilizzare la <strong>Resource API<\/strong> principalmente per le richieste <strong>GET<\/strong>, poich\u00e9 sono generalmente sicure e possono essere annullate senza causare problemi.<\/p>\n\n\n\n<p>Per le richieste <strong>POST<\/strong> o <strong>UPDATE<\/strong>, annullarle potrebbe causare effetti collaterali indesiderati, come l&#8217;invio incompleto dei dati o aggiornamenti non riusciti. Tuttavia, quando abbiamo bisogno di una funzionalit\u00e0 simile per questi tipi di richieste, possiamo utilizzare il metodo <code><strong>effect()<\/strong><\/code> per gestire in modo sicuro le operazioni.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-come-consumare-una-resource\">Come consumare una Resource<\/h2>\n\n\n\n<p>La <strong>Resource API<\/strong> fornisce diverse propriet\u00e0 sotto forma di signal per leggere il suo stato, che possiamo facilmente utilizzare direttamente all&#8217;interno dei nostri componenti o servizi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong>value<\/strong><\/code>: contiene il valore corrente della <strong><code><strong>Resource<\/strong><\/code><\/strong>, o <code><strong>undefined<\/strong><\/code> se non \u00e8 disponibile alcun valore. Essendo un <code><strong>WritableSignal<\/strong><\/code>, pu\u00f2 essere aggiornato manualmente;<\/li>\n\n\n\n<li><code><strong>status<\/strong><\/code>: contiene lo stato attuale della <strong><code><strong>Resource<\/strong><\/code><\/strong>, indica cosa sta facendo la <strong><code><strong>Resource<\/strong><\/code><\/strong> e cosa ci si pu\u00f2 aspettare dal suo <strong>valore<\/strong>;<\/li>\n\n\n\n<li><code><strong>error<\/strong><\/code>: se si trova nello stato di errore, contiene l&#8217;<strong>errore<\/strong> pi\u00f9 recente sollevato durante il caricamento della <code><strong>Resource<\/strong><\/code>;<\/li>\n\n\n\n<li><code><strong>isLoading<\/strong><\/code>: indica se la <code><strong>Resource<\/strong><\/code> sta caricando un nuovo valore o ricaricando quello esistente.<\/li>\n<\/ul>\n\n\n\n<p>Ecco un esempio di come consumare una <code><strong>Resource<\/strong><\/code> all&#8217;interno di un componente:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { Component, resource, signal } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'@angular\/core'<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> BASE_URL = <span class=\"hljs-string\">'https:\/\/jsonplaceholder.typicode.com\/todos\/'<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">@Component<\/span>({\n<\/span><\/span><span class='shcb-loc'><span>  selector: <span class=\"hljs-string\">'my-component'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>  template: <span class=\"hljs-string\">`<\/span>\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-string\">    @if (myResource.value()) {<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span><span class=\"hljs-string\">      {{ myResource.value().title }}<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span><span class=\"hljs-string\">    }<\/span>\n<\/span><\/mark><span class='shcb-loc'><span><span class=\"hljs-string\"><\/span>\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-string\">    &lt;button (click)=\"fetchNext()\"&gt;Carica il prossimo elemento&lt;\/button&gt;<\/span>\n<\/span><\/mark><span class='shcb-loc'><span><span class=\"hljs-string\">  `<\/span>\n<\/span><\/span><span class='shcb-loc'><span>})\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">class<\/span> MyComponent {\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-keyword\">private<\/span> id = signal(<span class=\"hljs-number\">1<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>  <span class=\"hljs-keyword\">protected<\/span> myResource = resource({\n<\/span><\/mark><mark class='shcb-loc'><span>    request: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ id: <span class=\"hljs-keyword\">this<\/span>.id() }),\n<\/span><\/mark><mark class='shcb-loc'><span>    loader: <span class=\"hljs-function\">(<span class=\"hljs-params\">{ <span class=\"hljs-params\">request<\/span> }<\/span>) =&gt;<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>      fetch(BASE_URL + request.id).then(<span class=\"hljs-function\">(<span class=\"hljs-params\"><span class=\"hljs-params\">response<\/span><\/span>) =&gt;<\/span> response.json()),\n<\/span><\/mark><mark class='shcb-loc'><span>  });\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-keyword\">protected<\/span> fetchNext(): <span class=\"hljs-built_in\">void<\/span> {\n<\/span><\/span><mark class='shcb-loc'><span>    <span class=\"hljs-keyword\">this<\/span>.id.update(<span class=\"hljs-function\">(<span class=\"hljs-params\"><span class=\"hljs-params\">id<\/span><\/span>) =&gt;<\/span> id + <span class=\"hljs-number\">1<\/span>);\n<\/span><\/mark><span class='shcb-loc'><span>  }\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In questo esempio, la <code><strong>Resource<\/strong><\/code> viene utilizzata per recuperare i dati da un&#8217;API in base al valore del signal <code><code><strong>id<\/strong><\/code><\/code>, che pu\u00f2 essere incrementato cliccando un pulsante.<\/p>\n\n\n\n<p>Ogni volta che l&#8217;utente clicca il pulsante, il valore del signal <code><code><strong>id<\/strong><\/code><\/code> cambia, attivando la funzione <code><code><strong>loader<\/strong><\/code><\/code> per recuperare un nuovo elemento dall&#8217;API remota.<\/p>\n\n\n\n<p>L&#8217;interfaccia utente si aggiorna automaticamente con i dati recuperati grazie alle propriet\u00e0 di signal esposte dalla <code><strong>Resource<\/strong><\/code> API.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-leggere-lo-stato-di-una-resource\">Leggere lo stato di una Resource<\/h2>\n\n\n\n<p>Come accennato in precedenza, il signal <code><strong>status<\/strong><\/code> fornisce informazioni sullo stato attuale della risorsa in un dato momento.<\/p>\n\n\n\n<p>I possibili valori del signal <code><strong>status<\/strong><\/code> sono definiti dall&#8217;enum <code><strong>ResourceStatus<\/strong><\/code>. Ecco un riepilogo di questi stati e dei loro valori corrispondenti:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Idle = <\/strong><code><strong>0<\/strong><\/code>: la <code><strong>Resource<\/strong><\/code> non ha una richiesta valida e non eseguir\u00e0 alcun caricamento. <code><strong>value()<\/strong><\/code> \u00e8 <code><code><strong>undefined<\/strong><\/code><\/code>;<\/li>\n\n\n\n<li><strong>Error = <\/strong><code><strong>1<\/strong><\/code>: il caricamento \u00e8 fallito con un errore. <code><strong>value()<\/strong><\/code> \u00e8 <code><strong>undefined<\/strong><\/code>;<\/li>\n\n\n\n<li><strong>Loading = <\/strong><code><strong>2<\/strong><\/code>: la risorsa sta attualmente caricando un nuovo valore a seguito di una modifica nella sua richiesta. <code><strong>value()<\/strong><\/code> \u00e8 <code><strong>undefined<\/strong><\/code>;<\/li>\n\n\n\n<li><strong>Reloading = <\/strong><code><strong>3<\/strong><\/code>: la risorsa sta attualmente ricaricando un valore aggiornato per la stessa richiesta. <code><strong>value()<\/strong><\/code> continuer\u00e0 a restituire il valore precedentemente recuperato fino al completamento dell&#8217;operazione di ricaricamento;<\/li>\n\n\n\n<li><strong>Resolved = <\/strong><code><strong>4<\/strong><\/code>: il caricamento \u00e8 completato. <code><strong>value()<\/strong><\/code> contiene il valore restituito dal processo di recupero dei dati del risultato della funzione <strong><code>loader()<\/code><\/strong>;<\/li>\n\n\n\n<li><strong>Local = <\/strong><code><strong>5<\/strong><\/code>: il valore \u00e8 stato impostato localmente tramite <code><strong>set()<\/strong><\/code> o <code><strong>update()<\/strong><\/code>. <code><strong>value()<\/strong><\/code> contiene il valore assegnato manualmente.<\/li>\n<\/ul>\n\n\n\n<p>Questi stati aiutano a tracciare i progressi della <code><strong>Resource<\/strong><\/code> e facilitano una gestione migliore delle operazioni asincrone nelle nostre applicazioni.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-la-funzione-hasvalue\">La funzione hasValue( )<\/h3>\n\n\n\n<p>Data la complessit\u00e0 di questi stati, la <strong>Resource API<\/strong> fornisce un metodo <code><strong>hasValue()<\/strong><\/code>, che restituisce un valore <strong>booleano<\/strong> in base allo stato attuale.<\/p>\n\n\n\n<p>Questo garantisce informazioni accurate sullo stato della <code><strong>Resource<\/strong><\/code>, fornendo un modo pi\u00f9 affidabile per gestire le operazioni asincrone senza fare affidamento sul valore, che potrebbe essere <code><code><strong>undefined<\/strong><\/code><\/code> in determinati stati.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\">hasValue() {\n  <span class=\"hljs-keyword\">return<\/span> (\n    <span class=\"hljs-keyword\">this<\/span>.status() === ResourceStatus.Resolved ||\n    <span class=\"hljs-keyword\">this<\/span>.status() === ResourceStatus.Local ||\n    <span class=\"hljs-keyword\">this<\/span>.status() === ResourceStatus.Reloading\n  );\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Questo metodo \u00e8 reattivo, permettendoti di consumarlo e tracciarlo come un <strong>signal<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-la-funzione-isloading\">La funzione isLoading( )<\/h3>\n\n\n\n<p>La <strong>Resource API<\/strong> fornisce anche un signal <code><code><strong>isLoading<\/strong><\/code><\/code>, che restituisce se la risorsa \u00e8 attualmente nello stato di <code><strong>Loading<\/strong><\/code> o <code><strong>Reloading<\/strong><\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\">readonly isLoading = computed(\n  <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span>\n    <span class=\"hljs-keyword\">this<\/span>.status() === ResourceStatus.Loading ||\n    <span class=\"hljs-keyword\">this<\/span>.status() === ResourceStatus.Reloading\n);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dato che <code><strong>isLoading<\/strong><\/code> \u00e8 un computed signal, pu\u00f2 essere tracciato reattivamente, permettendoci di monitorare lo stato in tempo reale utilizzando le API dei signal.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-value-come-writablesignal\">value come WritableSignal<\/h2>\n\n\n\n<p>Il signal <code><strong>value<\/strong><\/code> fornito da una <code><strong>Resource<\/strong><\/code> \u00e8 un <code><code><strong>WritableSignal<\/strong><\/code><\/code>, che ci consente di aggiornarlo manualmente utilizzando le funzioni <code><strong>set()<\/strong><\/code> e <code><strong>update()<\/strong><\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { resource, signal } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"@angular\/core\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> RESOURCE_URL = <span class=\"hljs-string\">\"https:\/\/jsonplaceholder.typicode.com\/todos\/\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> id = signal(<span class=\"hljs-number\">1<\/span>);\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> myResource = resource({\n<\/span><\/span><span class='shcb-loc'><span>  request: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ id: id() }),\n<\/span><\/span><span class='shcb-loc'><span>  loader: <span class=\"hljs-function\">(<span class=\"hljs-params\">{ <span class=\"hljs-params\">request<\/span> }<\/span>) =&gt;<\/span> fetch(RESOURCE_URL + request.id)\n<\/span><\/span><span class='shcb-loc'><span>});\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 2 (che significa \"Loading\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Dopo che la fetch \u00e8 stata completata<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 4 (che significa \"Resolved\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.value()); <span class=\"hljs-comment\">\/\/ Stampa: { \"id\": 1 , ... }<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>myResource.value.set({ id: <span class=\"hljs-number\">2<\/span> });\n<\/span><\/mark><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.value()); <span class=\"hljs-comment\">\/\/ Stampa: { id: 2 }<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 5 (che significa \"Local\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>myResource.value.update(<span class=\"hljs-function\">(<span class=\"hljs-params\"><span class=\"hljs-params\">value<\/span><\/span>) =&gt;<\/span> ({ ...value, name: <span class=\"hljs-string\">'Davide'<\/span> });\n<\/span><\/mark><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.value()); <span class=\"hljs-comment\">\/\/ Stampa: { id: 2, name: 'Davide' }<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 5 (che significa \"Local\")<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Nota:<\/strong> come possiamo vedere, l&#8217;aggiornamento manuale del valore del signal imposter\u00e0 anche lo stato su <strong>5<\/strong>, che significa &#8220;<strong>Local<\/strong>&#8220;, per indicare che il valore \u00e8 stato impostato localmente.<\/p>\n<\/blockquote>\n\n\n\n<p>Il valore impostato manualmente persister\u00e0 fino a quando non verr\u00e0 impostato un nuovo valore o non verr\u00e0 eseguita una nuova richiesta, che lo sovrascriver\u00e0 con un nuovo valore.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { resource, signal } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"@angular\/core\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> RESOURCE_URL = <span class=\"hljs-string\">\"https:\/\/jsonplaceholder.typicode.com\/todos\/\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> id = signal(<span class=\"hljs-number\">1<\/span>);\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> myResource = resource({\n<\/span><\/span><span class='shcb-loc'><span>  request: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ id: id() }),\n<\/span><\/span><span class='shcb-loc'><span>  loader: <span class=\"hljs-function\">(<span class=\"hljs-params\">{ <span class=\"hljs-params\">request<\/span> }<\/span>) =&gt;<\/span> fetch(RESOURCE_URL + request.id)\n<\/span><\/span><span class='shcb-loc'><span>});\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 2 (che significa \"Loading\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Dopo che la fetch \u00e8 stata completata<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 4 (che significa \"Resolved\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.value()); <span class=\"hljs-comment\">\/\/ Stampa: { \"id\": 1 , ... }<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>myResource.value.set({ id: <span class=\"hljs-number\">2<\/span> });\n<\/span><\/mark><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.value()); <span class=\"hljs-comment\">\/\/ Stampa: { id: 2 }<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 5 (che significa \"Local\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>id.set(<span class=\"hljs-number\">3<\/span>); <span class=\"hljs-comment\">\/\/ Triggers a request, causing the loader function to run again<\/span>\n<\/span><\/mark><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 2 (che significa \"Loading\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Dopo che la fetch \u00e8 stata completata<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 4 (che significa \"Resolved\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.value()); <span class=\"hljs-comment\">\/\/ Stampa: { \"id\": 3 , ... }<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Nota:<\/strong> il signal <code><strong>value<\/strong><\/code> della <strong>Resource API<\/strong> utilizza lo stesso pattern della nuova <strong><code><strong><em>LinkedSignal<\/em><\/strong><\/code><\/strong> API, ma non la utilizza internamente. \ud83e\udd13<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-metodi-wrapper-di-convenienza\">Metodi wrapper di convenienza<\/h3>\n\n\n\n<p>Per semplificare l&#8217;uso del signal <code><code><strong>value<\/strong><\/code><\/code>, la Resource API fornisce wrapper di convenienza per i metodi <code><strong>set<\/strong><\/code>, <code><strong>update<\/strong><\/code> e <code><strong>asReadonly<\/strong><\/code>.<\/p>\n\n\n\n<p>Il metodo <code><code><strong>asReadonly<\/strong><\/code><\/code> \u00e8 particolarmente utile poich\u00e9 restituisce un&#8217;istanza di sola lettura del signal <code><code><strong>value<\/strong><\/code><\/code>, consentendo soltanto la lettura e prevenendo modifiche accidentali.<\/p>\n\n\n\n<p>Possiamo utilizzare questo approccio per creare servizi che gestiscono e tracciano i cambiamenti dei valori delle risorse esportando un&#8217;istanza di sola lettura del signal <code><strong>value<\/strong><\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { resource, signal } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"@angular\/core\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> RESOURCE_URL = <span class=\"hljs-string\">\"https:\/\/jsonplaceholder.typicode.com\/todos\/\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">class<\/span> MyService {\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-keyword\">const<\/span> id = signal(<span class=\"hljs-number\">1<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-keyword\">const<\/span> myResource = resource({\n<\/span><\/span><span class='shcb-loc'><span>    request: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ id: id() }),\n<\/span><\/span><span class='shcb-loc'><span>    loader: <span class=\"hljs-function\">(<span class=\"hljs-params\">{ <span class=\"hljs-params\">request<\/span> }<\/span>) =&gt;<\/span> fetch(RESOURCE_URL + request.id })\n<\/span><\/span><span class='shcb-loc'><span>  });\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>  <span class=\"hljs-keyword\">public<\/span> myValue = myResource.value.asReadonly();\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>  setValue(newValue) {\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-comment\">\/\/ Wrapper di `myResource.value.set()`<\/span>\n<\/span><\/span><mark class='shcb-loc'><span>    myResource.set(newValue);\n<\/span><\/mark><span class='shcb-loc'><span>  }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>  addToValue(addToValue) {\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-comment\">\/\/ Wrapper di `myResource.value.update()`<\/span>\n<\/span><\/span><mark class='shcb-loc'><span>    myResource.update(<span class=\"hljs-function\">(<span class=\"hljs-params\"><span class=\"hljs-params\">value<\/span><\/span>) =&gt;<\/span> ({ ...value, ...addToValue });\n<\/span><\/mark><span class='shcb-loc'><span>  }\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Utilizzo del servizio in un componente o in un'altra parte dell'applicazione<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> myService = <span class=\"hljs-keyword\">new<\/span> MyService();\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>myService.myValue.set(<span class=\"hljs-literal\">null<\/span>); <span class=\"hljs-comment\">\/\/ Property 'set' does not exist in type 'Signal'<\/span>\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>myService.setValue({ id: <span class=\"hljs-number\">2<\/span> });\n<\/span><\/mark><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myService.myValue()); <span class=\"hljs-comment\">\/\/ Stampa: { id: 2 }<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>myService.addToValue({ name: <span class=\"hljs-string\">'Davide'<\/span> });\n<\/span><\/mark><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myService.myValue()); <span class=\"hljs-comment\">\/\/ Stampa: { id: 2, name: 'Davide' }<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Questo impedir\u00e0 ai consumatori di modificare il valore, riducendo il rischio di modifiche non intenzionali e migliorando la coerenza nella gestione dei dati complessi.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-ricaricare-o-distruggere-una-resource\">Ricaricare o distruggere una Resource<\/h2>\n\n\n\n<p>Quando si lavora con risorse asincrone, possiamo trovarci di fronte a scenari in cui \u00e8 necessario aggiornare i dati o distruggere la <code><strong>Resource<\/strong><\/code>.<\/p>\n\n\n\n<p>Per gestire questi scenari, la <strong>Resource API<\/strong> fornisce due metodi dedicati che offrono soluzioni efficienti per la gestione di queste azioni.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-la-funzione-reload\">La funzione reload( )<\/h3>\n\n\n\n<p>Il metodo <code><strong>reload()<\/strong><\/code> istruisce la <code><strong>Resource<\/strong><\/code> a rieseguire la richiesta asincrona, assicurandosi di recuperare i dati pi\u00f9 aggiornati:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { resource, signal } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"@angular\/core\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> RESOURCE_URL = <span class=\"hljs-string\">\"https:\/\/jsonplaceholder.typicode.com\/todos\/\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> id = signal(<span class=\"hljs-number\">1<\/span>);\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> myResource = resource({\n<\/span><\/span><span class='shcb-loc'><span>  request: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ id: id() }),\n<\/span><\/span><span class='shcb-loc'><span>  loader: <span class=\"hljs-function\">(<span class=\"hljs-params\">{ <span class=\"hljs-params\">request<\/span> }<\/span>) =&gt;<\/span> fetch(RESOURCE_URL + request.id)\n<\/span><\/span><span class='shcb-loc'><span>});\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 2 (che significa \"Loading\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Dopo che la fetch \u00e8 stata completata<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 4 (che significa \"Resolved\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>myResource.reload(); <span class=\"hljs-comment\">\/\/ Returns true if a reload was initiated<\/span>\n<\/span><\/mark><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 3 (che significa \"Reloading\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Dopo che la fetch \u00e8 stata completata<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Prints: 5 (che significa \"Local\")<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Il metodo <code><strong>reload()<\/strong><\/code> restituisce <code><strong>true<\/strong><\/code> se il nuovo caricamento \u00e8 stato avviato con successo.<\/p>\n\n\n\n<p>Se un ricaricamento non pu\u00f2 essere eseguito, sia perch\u00e9 non \u00e8 necessario, ad esempio quando lo stato \u00e8 gi\u00e0 <strong>Loading<\/strong> o <strong>Reloading<\/strong>, o non supportato, come quando lo stato \u00e8 <strong>Idle<\/strong>, il metodo restituisce <code><strong>false<\/strong><\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-la-funzione-destroy\">La funzione destroy( )<\/h3>\n\n\n\n<p>Il metodo <code><strong>destroy()<\/strong><\/code> distrugge manualmente la <code><strong>Resource<\/strong><\/code>, distruggendo qualsiasi <code><strong>effect()<\/strong><\/code> utilizzato per tracciare i cambiamenti della richiesta, annullando eventuali richieste in sospeso e impostando lo stato su <strong><code><strong>Idle<\/strong><\/code><\/strong>, mentre resetta il valore a <code><strong>undefined<\/strong><\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { resource, signal } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"@angular\/core\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> RESOURCE_URL = <span class=\"hljs-string\">\"https:\/\/jsonplaceholder.typicode.com\/todos\/\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> id = signal(<span class=\"hljs-number\">1<\/span>);\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> myResource = resource({\n<\/span><\/span><span class='shcb-loc'><span>  request: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ id: id() }),\n<\/span><\/span><span class='shcb-loc'><span>  loader: <span class=\"hljs-function\">(<span class=\"hljs-params\">{ <span class=\"hljs-params\">request<\/span> }<\/span>) =&gt;<\/span> fetch(RESOURCE_URL + request.id)\n<\/span><\/span><span class='shcb-loc'><span>});\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 2 (che significa \"Loading\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Dopo che la fetch \u00e8 stata completata<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 4 (che significa \"Resolved\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>myResource.destroy(); <span class=\"hljs-comment\">\/\/ Restituisce true se l'operazione di reload \u00e8 stata avviata<\/span>\n<\/span><\/mark><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 1 (che significa \"Idle\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.value()); <span class=\"hljs-comment\">\/\/ Stampa: undefined<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dopo che una <code><strong>Resource<\/strong><\/code> \u00e8 stata distrutta, non risponder\u00e0 pi\u00f9 ai cambiamenti della richiesta o alle operazioni <code><strong>reload()<\/strong><\/code>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Nota:<\/strong> a questo punto, mentre il signal <code><code><strong>value<\/strong><\/code><\/code> rimane scrivibile, la <code><strong>Resource<\/strong><\/code> perder\u00e0 il suo scopo originale e non svolger\u00e0 pi\u00f9 la sua funzione, diventando praticamente inutile. \ud83d\ude43<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-la-funzione-rxresource\">La funzione rxResource( )<\/h2>\n\n\n\n<p>Come quasi tutte le API basate su signal introdotte finora, la <code><strong>Resource<\/strong><\/code> API offre anche un&#8217;utilit\u00e0 di interoperabilit\u00e0 per un&#8217;integrazione con <strong>RxJS<\/strong>.<\/p>\n\n\n\n<p>Invece di utilizzare il metodo <code><strong>resource()<\/strong><\/code> per creare una <code><strong>Resource<\/strong><\/code> basata su Promise, possiamo usare il metodo <code><strong>rxResource()<\/strong><\/code> per utilizzare gli Observable:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { resource, signal } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"@angular\/core\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { rxResource } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'@angular\/core\/rxjs-interop'<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">import<\/span> { fromFetch } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'rxjs\/fetch'<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> RESOURCE_URL = <span class=\"hljs-string\">\"https:\/\/jsonplaceholder.typicode.com\/todos\/\"<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> id = signal(<span class=\"hljs-number\">1<\/span>);\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> myResource = rxResource({\n<\/span><\/mark><mark class='shcb-loc'><span>  request: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ id: id() }),\n<\/span><\/mark><mark class='shcb-loc'><span>  loader: <span class=\"hljs-function\">(<span class=\"hljs-params\">{ <span class=\"hljs-params\">request<\/span> }<\/span>) =&gt;<\/span> fromFetch(RESOURCE_URL + request.id)\n<\/span><\/mark><mark class='shcb-loc'><span>});\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 2 (che significa \"Loading\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Dopo che la fetch \u00e8 stata completata<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.status()); <span class=\"hljs-comment\">\/\/ Stampa: 4 (che significa \"Resolved\")<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(myResource.value()); <span class=\"hljs-comment\">\/\/ Stampa: { \"id\": 1 , ... }<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Nota:<\/strong> il metodo <code><strong>rxResource()<\/strong><\/code> \u00e8 infatti esposto dal pacchetto <code><strong>rxjs-interop<\/strong><\/code>.<\/p>\n<\/blockquote>\n\n\n\n<p>Dall&#8217;<strong>Observable<\/strong> prodotto dalla funzione <code><strong>loader()<\/strong><\/code> verr\u00e0 letto solo il primo valore emesso, le emissioni successive saranno ignorate.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-grazie-per-aver-letto-questo-articolo-nbsp\">Grazie per aver letto questo articolo&nbsp;\ud83d\ude4f<\/h2>\n\n\n\n<p>Mi piacerebbe avere qualche feedback quindi grazie in anticipo per qualsiasi commento.&nbsp;<em>\ud83d\udc4f<\/em><\/p>\n\n\n\n<p>Infine, se ti \u00e8 piaciuto davvero tanto,&nbsp;<strong>condividilo<\/strong>&nbsp;con la tua community. \ud83d\udc4b\ud83d\ude01<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il rilascio di Angular v19, avvenuto poche settimane fa, segna un traguardo importante nella rivoluzione dei signal all&#8217;interno del framework, con le API Input, Model, Output e Signal Queries ora ufficialmente promosse a stabili. Ma non \u00e8 tutto! Questa versione major introduce anche nuovi strumenti potenti progettati per far progredire ulteriormente la rivoluzione dei signal:&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/\">Read more<\/a><\/p>\n","protected":false},"author":200,"featured_media":30856,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10265,10289],"tags":[11586,10438],"collections":[11708],"class_list":{"0":"post-31283","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-frontend-it","8":"category-javascript-it","9":"tag-angular-it","10":"tag-sviluppo-software-it","11":"collections-dalla-community","12":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Angular Resource API: la guida completa<\/title>\n<meta name=\"description\" content=\"Angular v19 ha introdotto la nuova Resource API, progettata per semplificare il caricamento delle risorse asincrone sfruttando tutta la potenza dei signal!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular Resource API: la guida completa\" \/>\n<meta property=\"og:description\" content=\"Angular v19 ha introdotto la nuova Resource API, progettata per semplificare il caricamento delle risorse asincrone sfruttando tutta la potenza dei signal!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-05T14:15:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-02-05T14:17:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Davide Passafaro\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Davide Passafaro\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/angular-resource-api-la-guida-completa\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/angular-resource-api-la-guida-completa\\\/\"},\"author\":{\"name\":\"Davide Passafaro\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/79170e2a1bfc41ddeaa10827ce803828\"},\"headline\":\"Angular Resource API: la guida completa\",\"datePublished\":\"2025-02-05T14:15:07+00:00\",\"dateModified\":\"2025-02-05T14:17:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/angular-resource-api-la-guida-completa\\\/\"},\"wordCount\":1485,\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/angular-resource-api-la-guida-completa\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with.webp\",\"keywords\":[\"Angular\",\"sviluppo software\"],\"articleSection\":[\"Frontend\",\"JavaScript\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/angular-resource-api-la-guida-completa\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/angular-resource-api-la-guida-completa\\\/\",\"name\":\"Angular Resource API: la guida completa\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/angular-resource-api-la-guida-completa\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/angular-resource-api-la-guida-completa\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with.webp\",\"datePublished\":\"2025-02-05T14:15:07+00:00\",\"dateModified\":\"2025-02-05T14:17:53+00:00\",\"description\":\"Angular v19 ha introdotto la nuova Resource API, progettata per semplificare il caricamento delle risorse asincrone sfruttando tutta la potenza dei signal!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/angular-resource-api-la-guida-completa\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/angular-resource-api-la-guida-completa\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/angular-resource-api-la-guida-completa\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with.webp\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with.webp\",\"width\":1792,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/angular-resource-api-la-guida-completa\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Frontend\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/frontend-it\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Angular Resource API: la guida completa\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Codemotion.Italy\\\/\",\"https:\\\/\\\/x.com\\\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/79170e2a1bfc41ddeaa10827ce803828\",\"name\":\"Davide Passafaro\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Immagine-profilo-GDE-430kb-100x100.png\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Immagine-profilo-GDE-430kb-100x100.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Immagine-profilo-GDE-430kb-100x100.png\",\"caption\":\"Davide Passafaro\"},\"description\":\"My name is Davide Passafaro and I am Senior Frontend Engineer at Awork. I lead two developer communities in Rome, GDG Roma Citt\u00e0 and Angular Rome, and actively contribute to the tech community as a writer and speaker. When i shut down my computer I like to play board games and archery, not both together till now. I also like escape rooms and memes.\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/davide-passafaro\\\/\"],\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/author\\\/davidepassafaro\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Angular Resource API: la guida completa","description":"Angular v19 ha introdotto la nuova Resource API, progettata per semplificare il caricamento delle risorse asincrone sfruttando tutta la potenza dei signal!","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:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/","og_locale":"en_US","og_type":"article","og_title":"Angular Resource API: la guida completa","og_description":"Angular v19 ha introdotto la nuova Resource API, progettata per semplificare il caricamento delle risorse asincrone sfruttando tutta la potenza dei signal!","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2025-02-05T14:15:07+00:00","article_modified_time":"2025-02-05T14:17:53+00:00","og_image":[{"width":1792,"height":1024,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with.webp","type":"image\/webp"}],"author":"Davide Passafaro","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Davide Passafaro","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/"},"author":{"name":"Davide Passafaro","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/79170e2a1bfc41ddeaa10827ce803828"},"headline":"Angular Resource API: la guida completa","datePublished":"2025-02-05T14:15:07+00:00","dateModified":"2025-02-05T14:17:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/"},"wordCount":1485,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with.webp","keywords":["Angular","sviluppo software"],"articleSection":["Frontend","JavaScript"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/","name":"Angular Resource API: la guida completa","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with.webp","datePublished":"2025-02-05T14:15:07+00:00","dateModified":"2025-02-05T14:17:53+00:00","description":"Angular v19 ha introdotto la nuova Resource API, progettata per semplificare il caricamento delle risorse asincrone sfruttando tutta la potenza dei signal!","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with.webp","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with.webp","width":1792,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/angular-resource-api-la-guida-completa\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Frontend","item":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/"},{"@type":"ListItem","position":3,"name":"Angular Resource API: la guida completa"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/79170e2a1bfc41ddeaa10827ce803828","name":"Davide Passafaro","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/Immagine-profilo-GDE-430kb-100x100.png","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/Immagine-profilo-GDE-430kb-100x100.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/Immagine-profilo-GDE-430kb-100x100.png","caption":"Davide Passafaro"},"description":"My name is Davide Passafaro and I am Senior Frontend Engineer at Awork. I lead two developer communities in Rome, GDG Roma Citt\u00e0 and Angular Rome, and actively contribute to the tech community as a writer and speaker. When i shut down my computer I like to play board games and archery, not both together till now. I also like escape rooms and memes.","sameAs":["https:\/\/www.linkedin.com\/in\/davide-passafaro\/"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/davidepassafaro\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-600x400.webp","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-600x600.webp","author_info":{"display_name":"Davide Passafaro","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/davidepassafaro\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with.webp",1792,1024,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-150x150.webp",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-300x171.webp",300,171,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-768x439.webp",768,439,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-1024x585.webp",1024,585,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-1536x878.webp",1536,878,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with.webp",1792,1024,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-100x100.webp",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-180x128.webp",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-896x504.webp",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-400x225.webp",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-600x400.webp",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-28-10.47.22-A-horizontal-image-showing-a-group-of-developers-working-together-to-create-technical-documents.-The-scene-takes-place-in-a-bright-modern-office-with-600x600.webp",600,600,true]},"uagb_author_info":{"display_name":"Davide Passafaro","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/davidepassafaro\/"},"uagb_comment_info":0,"uagb_excerpt":"Il rilascio di Angular v19, avvenuto poche settimane fa, segna un traguardo importante nella rivoluzione dei signal all&#8217;interno del framework, con le API Input, Model, Output e Signal Queries ora ufficialmente promosse a stabili. Ma non \u00e8 tutto! Questa versione major introduce anche nuovi strumenti potenti progettati per far progredire ulteriormente la rivoluzione dei signal:&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/31283","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/200"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=31283"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/31283\/revisions"}],"predecessor-version":[{"id":31936,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/31283\/revisions\/31936"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/30856"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=31283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=31283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=31283"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=31283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}