{"id":33794,"date":"2025-08-19T13:05:05","date_gmt":"2025-08-19T11:05:05","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=33794"},"modified":"2025-08-19T13:05:07","modified_gmt":"2025-08-19T11:05:07","slug":"angular-deep-signal-modellare-lo-stato-in-profondita","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/","title":{"rendered":"Angular Deep Signal: Modellare lo Stato in Profondit\u00e0"},"content":{"rendered":"\n<p>Con l\u2019introduzione dei <strong>Signals<\/strong> in Angular, la gestione dello stato \u00e8 diventata molto pi\u00f9 chiara, manutenibile e prevedibile.<\/p>\n\n\n\n<p>Grazie alle primitive come <code><strong>signal()<\/strong><\/code>, <code><strong>computed()<\/strong><\/code> ed <code><strong>effect()<\/strong><\/code>, possiamo modellare e derivare i dati in modo efficace, mantenendo sotto controllo le dipendenze tra i vari pezzi di stato.<\/p>\n\n\n\n<p>Tuttavia, <strong>aggiornare i valori derivati non \u00e8 altrettanto immediato<\/strong> e richiede spesso interventi manuali sullo stato principale.<\/p>\n\n\n\n<p>Per rispondere a questa esigenza il team di Angular sta lavorando ad una nuova primitiva: <strong>Deep Signal<\/strong>.<br>Si tratta di una soluzione robusta per <strong>accedere e modificare direttamente, in modo reattivo, le propriet\u00e0 annidate<\/strong> all\u2019interno di un altro Signal.<\/p>\n\n\n\n<p>In questo articolo vedremo cosa sono i <strong>Deep Signal<\/strong>, come funzionano e perch\u00e9 possono semplificare il codice delle nostre applicazioni Angular.<\/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-accedere-e-aggiornare-lo-stato-nbsp-annidato\">\ud83c\udfaf Accedere e aggiornare lo stato&nbsp;annidato<\/h2>\n\n\n\n<p>Consideriamo il caso di un\u2019applicazione che gestisce i dati anagrafici di un utente. Uno scenario molto comune, in cui lo stato applicativo racchiude informazioni come <strong>nome<\/strong>, <strong>cognome<\/strong> e <strong>citt\u00e0<\/strong> di residenza:<\/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 shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> userModel = signal({\n<\/span><\/span><span class='shcb-loc'><span>  name: <span class=\"hljs-string\">'Davide'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>  lastname: <span class=\"hljs-string\">'Passafaro'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>  city: <span class=\"hljs-string\">'Rome'<\/span>\n<\/span><\/span><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-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>Grazie ai <code><strong>computed()<\/strong><\/code> Signal, possiamo facilmente derivare valori da questo stato, ad esempio per ottenere il <strong>nome<\/strong> e la <strong>citt\u00e0<\/strong> dell\u2019utente:<\/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 shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> userName = computed(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> userModel().name);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> userCity = computed(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> userModel().city);\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>Supponiamo ora di voler consentire all\u2019utente di aggiornare le proprie informazioni tramite un form. Grazie ad <code><strong>ngModel<\/strong><\/code>, possiamo collegare direttamente gli input del form ai valori dei nostri Signals:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>Nome: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> &#91;(<span class=\"hljs-attr\">ngModel<\/span>)]=<span class=\"hljs-string\">\"userName()\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>Citt\u00e0: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> &#91;(<span class=\"hljs-attr\">ngModel<\/span>)]=<span class=\"hljs-string\">\"userCity()\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/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\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Tuttavia, qui sorge un problema: i valori derivati da <code><strong>computed()<\/strong><\/code> sono <strong>solamente in lettura<\/strong> e quindi non possono essere aggiornati direttamente.<\/p>\n\n\n\n<p>La direttiva <code><strong>ngModel<\/strong><\/code>, invece, si aspetta di poter sia leggere che scrivere sul modello associato.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-linked-signal-un-workaround-non-proprio-una-soluzione\">Linked Signal: un workaround, non proprio una soluzione<\/h3>\n\n\n\n<p>Per aggiornare una propriet\u00e0 annidata, siamo costretti a intervenire manualmente sullo stato padre, creando una funzione dedicata.<\/p>\n\n\n\n<p>Nel nostro esempio, possiamo definire una funzione <code><strong>updateCity<\/strong><\/code> come questa:<\/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 shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">updateCity<\/span>(<span class=\"hljs-params\">newCity: <span class=\"hljs-built_in\">string<\/span><\/span>) <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>  userModel.update(<span class=\"hljs-function\"><span class=\"hljs-params\">user<\/span> =&gt;<\/span> ({ ...user, city: newCity }));\n<\/span><\/span><span class='shcb-loc'><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>A questo punto, colleghiamo poi questa funzione all\u2019input del form, gestendo esplicitamente l\u2019evento di modifica:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  Citt\u00e0:\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-tag\">    <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-tag\">    &#91;<span class=\"hljs-attr\">ngModel<\/span>]=<span class=\"hljs-string\">\"userCity()\"<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-tag\">    (<span class=\"hljs-attr\">ngModelChange<\/span>)=<span class=\"hljs-string\">\"updateCity($event)\"<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-tag\">  \/&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/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\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Questa soluzione, seppur funzionale, <strong>non \u00e8 reattiva<\/strong> di per s\u00e9: si basa su una chiamata esplicita della funzione <strong>updateCity()<\/strong>, lasciando a noi il compito di mantenere la coerenza dello stato.&nbsp;<\/p>\n\n\n\n<p>E, come sappiamo, ci\u00f2 non avviene sempre in modo sistematico.<\/p>\n\n\n\n<p>Per aggirare questa limitazione, possiamo utilizzare <code><strong>linkedSignal()<\/strong><\/code>: una funzione che <strong>consente di creare un Signal derivato ma anche scrivibile<\/strong>.<\/p>\n\n\n\n<p>Combinando il tutto con un <code><strong>effect()<\/strong><\/code>, possiamo ottenere una sorta di sincronizzazione bidirezionale tra il valore derivato e lo stato principale:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>const userModel = signal({\n<\/span><\/span><span class='shcb-loc'><span>  name: 'Davide',\n<\/span><\/span><span class='shcb-loc'><span>  lastname: 'Passafaro',\n<\/span><\/span><span class='shcb-loc'><span>  city: 'Rome'\n<\/span><\/span><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>const userCity = linkedSignal(\n<\/span><\/span><span class='shcb-loc'><span>  () =&gt; () =&gt; userModel().city\n<\/span><\/span><span class='shcb-loc'><span>);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>effect(() =&gt; {\n<\/span><\/span><span class='shcb-loc'><span>  userModel.set({...userModel(), city: userCity())\n<\/span><\/span><span class='shcb-loc'><span>});\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In questo scenario, il valore di <code><strong>userCity()<\/strong><\/code> \u00e8 derivato da <code><strong>userModel()<\/strong><\/code>, ma pu\u00f2 anche essere aggiornato direttamente tramite <code><strong>userCity.set()<\/strong><\/code>.&nbsp;<\/p>\n\n\n\n<p>Il nostro form diventa molto pi\u00f9 lineare:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>Nome: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> &#91;(<span class=\"hljs-attr\">ngModel<\/span>)]=<span class=\"hljs-string\">\"userName()\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>Citt\u00e0: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> &#91;(<span class=\"hljs-attr\">ngModel<\/span>)]=<span class=\"hljs-string\">\"userCity()\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ogni modifica a <code><strong>userCity()<\/strong><\/code> viene intercettata dall\u2019<code><strong>effect()<\/strong><\/code>, che aggiorna di conseguenza lo stato principale. Otteniamo cos\u00ec una <strong>sincronizzazione bidirezionale manuale fatta in casa<\/strong>.<\/p>\n\n\n\n<p>Splendido!!!<\/p>\n\n\n\n<p>Beh, non proprio\u2026<\/p>\n\n\n\n<p>Risolviamo s\u00ec il problema, ma al prezzo di una maggiore complessit\u00e0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Perch\u00e9 utilizziamo <code><strong>linkedSignal()<\/strong><\/code> al posto di un semplice <code><strong>computed()<\/strong><\/code>?<\/li>\n\n\n\n<li>Come mai serve quell\u2019<code><strong>effect()<\/strong><\/code>?<\/li>\n<\/ul>\n\n\n\n<p>Queste sono tutte domande che i prossimi manutentori del codice, o i noi stessi del futuro, potrebbero porsi, o ritrovandosi davanti a un codice poco chiaro che non racconta chiaramente il \u201cperch\u00e9\u201d delle scelte fatte.<\/p>\n\n\n\n<p>Per questo motivo, serve una soluzione pi\u00f9 robusta e nativamente bidirezionale, che non richieda workaround manuali e che sia chiara ed esplicita anche per chi legger\u00e0 o manterr\u00e0 il codice in futuro.<\/p>\n\n\n\n<p>Ed \u00e8 proprio qui che entrano in gioco i <strong>Deep Signals<\/strong>.<\/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-primitiva-deep-nbsp-signal\">\ud83e\uddec La nuova primitiva Deep&nbsp;Signal<\/h2>\n\n\n\n<p>Con la nuova primitiva <strong>Deep Signal<\/strong>, Angular introduce una soluzione robusta e dichiarativa alla gestione degli stati derivati.<\/p>\n\n\n\n<p>Un <strong>Deep Signal<\/strong> consenti infatti di <strong>accedere e modificare direttamente<\/strong>, in modo <strong>reattivo<\/strong> e <strong>bidirezionale<\/strong>, <strong>propriet\u00e0 interne<\/strong> ad un <code><strong>signal()<\/strong><\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-come-si-crea-un-deep-nbsp-signal\">Come si crea un Deep&nbsp;Signal<\/h3>\n\n\n\n<p>Come per le altre primitive, anche per creare un <strong>Deep Signal<\/strong>, Angular mette a disposizione una funzione dedicata <code><strong>deepSignal()<\/strong><\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>const userModel = signal({\n<\/span><\/span><span class='shcb-loc'><span>  name: 'Davide',\n<\/span><\/span><span class='shcb-loc'><span>  lastname: 'Passafaro',\n<\/span><\/span><span class='shcb-loc'><span>  city: 'Rome'\n<\/span><\/span><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>const userCity = deepSignal(userModel, 'city');\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\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>La funzione <code><strong>deepSignal()<\/strong><\/code> accetta due parametri: il <strong>Signal padre<\/strong> contenente lo stato da cui vogliamo estrarre una propriet\u00e0, e la <strong>chiave<\/strong> (key) che identifica quella propriet\u00e0 all&#8217;interno della struttura, espressa come stringa o come <strong>Signal<\/strong> che contiene una stringa.<\/p>\n\n\n\n<p>Il valore ottenuto da <code><strong>deepSignal()<\/strong><\/code> \u00e8 a tutti gli effetti un <strong>Signal bidirezionale<\/strong>: possiamo quindi leggerne il valore come faremmo con un normale <code><strong>computed()<\/strong><\/code>, ma anche aggiornarlo direttamente tramite il metodo <code><strong>set()<\/strong><\/code> o <code><strong>update()<\/strong><\/code>, senza dover ricostruire manualmente lo stato padre.<\/p>\n\n\n\n<p>Nel nostro esempio:<\/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 shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-built_in\">console<\/span>.log(userCity()); <span class=\"hljs-comment\">\/\/ Prints \"Rome\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>userCity.set(<span class=\"hljs-string\">'Turin'<\/span>);   <span class=\"hljs-comment\">\/\/ Updates userModel().city<\/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<p>E naturalmente, essendo un <strong>Signal<\/strong>, pu\u00f2 essere utilizzato senza problemi anche nei template:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>Citt\u00e0: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> &#91;(<span class=\"hljs-attr\">ngModel<\/span>)]=<span class=\"hljs-string\">\"userCity()\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/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\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>La direttiva <code><strong>ngModel<\/strong><\/code> \u00e8 ora perfettamente compatibile: ogni modifica al campo input aggiorner\u00e0 direttamente lo stato annidato all&#8217;interno di <code><strong>userModel()<\/strong><\/code>, e viceversa.<\/p>\n\n\n\n<p>Questo approccio riduce drasticamente il boilerplate necessario e migliora la leggibilit\u00e0 e la coerenza del codice, rendendo le operazioni di accesso e aggiornamento su porzioni di stato annidate <strong>pi\u00f9 dirette, esplicite e sicure<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-performance-dei-deep-nbsp-signals\">Performance dei Deep&nbsp;Signals<\/h3>\n\n\n\n<p>I <strong>Deep Signal<\/strong> non sono solo pi\u00f9 comodi da usare, ma portano con se anche <strong>vantaggi sostanziali in termini di performance<\/strong>.<\/p>\n\n\n\n<p>Come abbiamo visto in precedenza, senza di essi, l\u2019aggiornamento di una propriet\u00e0 annidata richiede l\u2019aggiornamento del <strong>Signal padre<\/strong>.<\/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 shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> userModel = signal({\n<\/span><\/span><span class='shcb-loc'><span>  name: <span class=\"hljs-string\">'Davide'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>  lastname: <span class=\"hljs-string\">'Passafaro'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>  city: <span class=\"hljs-string\">'Rome'<\/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>\n<\/span><\/span><span class='shcb-loc'><span>userModel.set({...userModel(), city: <span class=\"hljs-string\">'Turin'<\/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>Questo comporta che <strong>ogni modifica anche minima<\/strong>, ad esempio aggiornare solo la propriet\u00e0 <code><strong>city<\/strong><\/code>, <strong>scatena l&#8217;elaborazione di tutti gli effetti o i componenti<\/strong> che dipendono anche solo in parte dallo stato completo <code><strong>userModel<\/strong><\/code>.<\/p>\n\n\n\n<p>In pratica, anche chi \u00e8 interessato solo al <code><strong>name<\/strong><\/code> o al <code><strong>lastname<\/strong><\/code> verr\u00e0 notificato e ogni stato derivato verr\u00e0 ricalcolato. Questi rileveranno poi che i dati a cui sono legati non sono effettivamente cambiati, e quindi eviteranno di propagare ulteriori notifiche di aggiornamento.<\/p>\n\n\n\n<p>Nonostante ci\u00f2, il costo in termini di prestazioni resta significativo, soprattutto in applicazioni con stati complessi o numerosi effetti collegati.<\/p>\n\n\n\n<p><strong>Deep Signal<\/strong> risolve questo problema grazie a una gestione pi\u00f9 granulare e mirata delle dipendenze: aggiorna direttamente le propriet\u00e0 annidate, notificando solo chi \u00e8 in ascolto di quella specifica porzione di stato.<\/p>\n\n\n\n<p>In questo modo, solo gli effetti e i componenti effettivamente interessati alla propriet\u00e0 modificata vengono aggiornati, riducendo drasticamente il numero di notifiche e ricalcoli superflui, con evidenti benefici sulle prestazioni.<\/p>\n\n\n\n<p>Ma non \u00e8 finita qui.<\/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-structural-signals-quando-la-struttura-conta\">\ud83e\uddf1 Structural Signals: quando la struttura conta<\/h2>\n\n\n\n<p>L\u2019introduzione dei <strong>Deep Signals<\/strong> apre la porta ad un altra primitiva Signal molto utile: <strong>Structural Signals<\/strong>.<\/p>\n\n\n\n<p>Uno <strong>Structural Signals<\/strong> viene derivato da un altro <strong>WritableSignal<\/strong>, che ne restituisce il valore completo come farebbe un Computed Signal con questa forma:<\/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 shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> userModel = signal({\n<\/span><\/span><span class='shcb-loc'><span>  name: <span class=\"hljs-string\">'Davide'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>  lastname: <span class=\"hljs-string\">'Passafaro'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>  city: <span class=\"hljs-string\">'Rome'<\/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>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> computedUserModal = computed(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> userModel());\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>L\u2019unica differenza significativa \u00e8 che uno <strong>Structural Signal<\/strong> non viene notificato quando i cambiamenti avvengono tramite un <strong>Deep Signal<\/strong>.<\/p>\n\n\n\n<p>Ci\u00f2 significa che uno <strong>Structural Signal<\/strong> rileva le modifiche solo quando il Signal padre viene aggiornato direttamente.<\/p>\n\n\n\n<p>Combinando con attenzione <strong>Structural Signal<\/strong> e <strong>Deep Signal<\/strong>, possiamo dunque ottenere un controllo pi\u00f9 granulare e intelligente sugli aggiornamenti, evitando trigger inutili causati da nuove referenze che in realt\u00e0 non modificano i contenuti.<\/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 shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> userModel = signal({\n<\/span><\/span><span class='shcb-loc'><span>  name: <span class=\"hljs-string\">'Davide'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>  lastname: <span class=\"hljs-string\">'Passafaro'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>  city: <span class=\"hljs-string\">'Rome'<\/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\">\/\/ Structural Signal: returns the entire object<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> userSnapshot = structuralSignal(userModel);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Deep Signal: accesses a specific nested property<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> userCity = deepSignal(userModel, <span class=\"hljs-string\">'city'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Effect that reacts only to full structural changes<\/span>\n<\/span><\/span><span class='shcb-loc'><span>effect(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">'\ud83e\uddf1 Structural update:'<\/span>, userSnapshot());\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\">\/\/ Effect that reacts only to changes in the city property<\/span>\n<\/span><\/span><span class='shcb-loc'><span>effect(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">'\ud83c\udf0d City changed:'<\/span>, userCity());\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\">\/\/ Update only the city: triggers only the Deep Signal effect<\/span>\n<\/span><\/span><span class='shcb-loc'><span>userCity.set(<span class=\"hljs-string\">'Milan'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Output:<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ \ud83c\udf0d City changed: Milan<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Structural update (new object): triggers both effects<\/span>\n<\/span><\/span><span class='shcb-loc'><span>userModel.set({\n<\/span><\/span><span class='shcb-loc'><span>  name: <span class=\"hljs-string\">'Davide'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>  lastname: <span class=\"hljs-string\">'Passafaro'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>  city: <span class=\"hljs-string\">'Turin'<\/span>\n<\/span><\/span><span class='shcb-loc'><span>});\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Output:<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ \ud83c\udf0d City changed: Turin<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ \ud83e\uddf1 Structural update: { name: 'Davide', lastname: 'Passafaro', city: 'Turin' }<\/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<p>In questo esempio, possiamo osservare un comportamento preciso:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se modifichiamo <strong>solo<\/strong> <code><strong>userCity<\/strong><\/code> tramite il <strong>Deep Signal<\/strong>, verr\u00e0 notificato solo chi ascolta quella propriet\u00e0 (come il primo <code><strong>effect()<\/strong><\/code>);<\/li>\n\n\n\n<li>Se invece sostituiamo l\u2019intero oggetto <code><strong>userModel<\/strong><\/code>, verranno notificati anche gli osservatori <strong>strutturali<\/strong> (come il secondo <code><strong>effect()<\/strong><\/code>).<\/li>\n<\/ul>\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-considerazioni-finali\">\u2705 <strong>Considerazioni finali<\/strong><\/h2>\n\n\n\n<p>L\u2019introduzione dei <strong>Deep Signals<\/strong> e degli <strong>Structural Signals<\/strong> rappresenta una aggiunta interessante al mondo Angular.<\/p>\n\n\n\n<p>Poter <strong>aggiornare uno stato derivato all\u2019interno di un Signal<\/strong> in modo chiaro e mirato, rappresenta un grande passo avanti per la <strong>leggibilit\u00e0<\/strong> del codice, la <strong>manutenibilit\u00e0<\/strong> e le <strong>performance<\/strong> delle applicazioni.<\/p>\n\n\n\n<p>Nonostante ci\u00f2, manca ancora qualcosa.<\/p>\n\n\n\n<p>Attualmente, i <strong>Deep Signal<\/strong> supportano solo propriet\u00e0 annidate ad un singolo livello di profondit\u00e0. Non \u00e8 ancora possibile accedere in modo reattivo a <strong>propriet\u00e0 pi\u00f9 profonde<\/strong> o a <strong>stati derivati da computazioni pi\u00f9 complesse<\/strong>.<\/p>\n\n\n\n<p>Queste limitazioni non tolgono valore alle nuove primitive, ma sono un chiaro <strong>segnale<\/strong> (badum-tss \ud83e\udd41) della direzione<strong> <\/strong>che Angular sta prendendo. Con ogni nuovo rilascio sta diventando sempre pi\u00f9 potente e flessibile.<\/p>\n\n\n\n<p>A noi non resta che aspettare, pronti a sperimentare le prossime novit\u00e0.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-link-utili-per-approfondire\">Link utili per approfondire<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/angular\/angular\/pull\/62962\/files#diff-a5dacbd9cf48a29ae38710189647532d1911644686978c693f1588ffc64613fa\" target=\"_blank\" rel=\"noreferrer noopener\">Deep signal, deep magic\u200a\u2014\u200aAngular PR #62962<\/a><\/li>\n<\/ul>\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","protected":false},"excerpt":{"rendered":"<p>Con l\u2019introduzione dei Signals in Angular, la gestione dello stato \u00e8 diventata molto pi\u00f9 chiara, manutenibile e prevedibile. Grazie alle primitive come signal(), computed() ed effect(), possiamo modellare e derivare i dati in modo efficace, mantenendo sotto controllo le dipendenze tra i vari pezzi di stato. Tuttavia, aggiornare i valori derivati non \u00e8 altrettanto immediato&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/\">Read more<\/a><\/p>\n","protected":false},"author":200,"featured_media":33882,"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":[10307],"tags":[11586,13491,10329,10327],"collections":[11708],"class_list":{"0":"post-33794","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-sviluppo-web","8":"tag-angular-it","9":"tag-deepsignal","10":"tag-framework","11":"tag-javascript-it","12":"collections-dalla-community","13":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Angular Deep Signal: Modellare lo Stato in Profondit\u00e0 - Codemotion Magazine<\/title>\n<meta name=\"description\" content=\"In questo articolo vedremo cosa sono i Deep Signal: una soluzione robusta per accedere e modificare direttamente, in modo reattivo, le propriet\u00e0 annidate all\u2019interno di un altro 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\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular Deep Signal: Modellare lo Stato in Profondit\u00e0\" \/>\n<meta property=\"og:description\" content=\"In questo articolo vedremo cosa sono i Deep Signal: una soluzione robusta per accedere e modificare direttamente, in modo reattivo, le propriet\u00e0 annidate all\u2019interno di un altro Signal.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/\" \/>\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-08-19T11:05:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-19T11:05:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png\" \/>\n\t<meta property=\"og:image:width\" content=\"725\" \/>\n\t<meta property=\"og:image:height\" content=\"482\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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=\"6 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\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/\"},\"author\":{\"name\":\"Davide Passafaro\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/79170e2a1bfc41ddeaa10827ce803828\"},\"headline\":\"Angular Deep Signal: Modellare lo Stato in Profondit\u00e0\",\"datePublished\":\"2025-08-19T11:05:05+00:00\",\"dateModified\":\"2025-08-19T11:05:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/\"},\"wordCount\":1269,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png\",\"keywords\":[\"Angular\",\"DeepSignal\",\"Framework\",\"JavaScript\"],\"articleSection\":[\"Sviluppo Web\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/\",\"name\":\"Angular Deep Signal: Modellare lo Stato in Profondit\u00e0 - Codemotion Magazine\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png\",\"datePublished\":\"2025-08-19T11:05:05+00:00\",\"dateModified\":\"2025-08-19T11:05:07+00:00\",\"description\":\"In questo articolo vedremo cosa sono i Deep Signal: una soluzione robusta per accedere e modificare direttamente, in modo reattivo, le propriet\u00e0 annidate all\u2019interno di un altro Signal.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png\",\"width\":725,\"height\":482,\"caption\":\"Angular\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#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\":\"Sviluppo Web\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Angular Deep Signal: Modellare lo Stato in Profondit\u00e0\"}]},{\"@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\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/Davide-photo-1mb-100x100.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/Davide-photo-1mb-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 Deep Signal: Modellare lo Stato in Profondit\u00e0 - Codemotion Magazine","description":"In questo articolo vedremo cosa sono i Deep Signal: una soluzione robusta per accedere e modificare direttamente, in modo reattivo, le propriet\u00e0 annidate all\u2019interno di un altro 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\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/","og_locale":"en_US","og_type":"article","og_title":"Angular Deep Signal: Modellare lo Stato in Profondit\u00e0","og_description":"In questo articolo vedremo cosa sono i Deep Signal: una soluzione robusta per accedere e modificare direttamente, in modo reattivo, le propriet\u00e0 annidate all\u2019interno di un altro Signal.","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2025-08-19T11:05:05+00:00","article_modified_time":"2025-08-19T11:05:07+00:00","og_image":[{"width":725,"height":482,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png","type":"image\/png"}],"author":"Davide Passafaro","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Davide Passafaro","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/"},"author":{"name":"Davide Passafaro","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/79170e2a1bfc41ddeaa10827ce803828"},"headline":"Angular Deep Signal: Modellare lo Stato in Profondit\u00e0","datePublished":"2025-08-19T11:05:05+00:00","dateModified":"2025-08-19T11:05:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/"},"wordCount":1269,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png","keywords":["Angular","DeepSignal","Framework","JavaScript"],"articleSection":["Sviluppo Web"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/","name":"Angular Deep Signal: Modellare lo Stato in Profondit\u00e0 - Codemotion Magazine","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png","datePublished":"2025-08-19T11:05:05+00:00","dateModified":"2025-08-19T11:05:07+00:00","description":"In questo articolo vedremo cosa sono i Deep Signal: una soluzione robusta per accedere e modificare direttamente, in modo reattivo, le propriet\u00e0 annidate all\u2019interno di un altro Signal.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png","width":725,"height":482,"caption":"Angular"},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/angular-deep-signal-modellare-lo-stato-in-profondita\/#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":"Sviluppo Web","item":"https:\/\/www.codemotion.com\/magazine\/it\/frontend-it\/sviluppo-web\/"},{"@type":"ListItem","position":4,"name":"Angular Deep Signal: Modellare lo Stato in Profondit\u00e0"}]},{"@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\/#\/schema\/person\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/Davide-photo-1mb-100x100.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/Davide-photo-1mb-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\/2025\/08\/Captura-de-pantalla-2025-08-19-130331-600x400.png","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331-600x482.png","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\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png",725,482,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331-150x150.png",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331-300x199.png",300,199,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png",725,482,false],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png",725,482,false],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png",725,482,false],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png",725,482,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331-100x100.png",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331-180x128.png",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331.png",725,482,false],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331-400x225.png",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331-600x400.png",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/08\/Captura-de-pantalla-2025-08-19-130331-600x482.png",600,482,true]},"uagb_author_info":{"display_name":"Davide Passafaro","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/davidepassafaro\/"},"uagb_comment_info":0,"uagb_excerpt":"Con l\u2019introduzione dei Signals in Angular, la gestione dello stato \u00e8 diventata molto pi\u00f9 chiara, manutenibile e prevedibile. Grazie alle primitive come signal(), computed() ed effect(), possiamo modellare e derivare i dati in modo efficace, mantenendo sotto controllo le dipendenze tra i vari pezzi di stato. Tuttavia, aggiornare i valori derivati non \u00e8 altrettanto immediato&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/33794","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=33794"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/33794\/revisions"}],"predecessor-version":[{"id":33883,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/33794\/revisions\/33883"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/33882"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=33794"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=33794"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=33794"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=33794"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}