<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Carlo Straccialini</title><description>Notes on frontend architecture, compilers, and web performance.</description><link>https://carlo-straccialini-blog.pages.dev</link><item><title>From Angular.js to Fine-Grained Reactivity: Compiling Templates at Build-Time</title><link>https://carlo-straccialini-blog.pages.dev/posts/angularjs-fine-grained-reactivity-compiling-templates</link><guid isPermaLink="true">https://carlo-straccialini-blog.pages.dev/posts/angularjs-fine-grained-reactivity-compiling-templates</guid><description>How a build-time compiler can migrate legacy Angular.js templates to fine-grained reactivity without rewriting templates or controllers.</description><pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We are in 2026, but in some corners of the enterprise world, it still feels like 2014. One of those places is the frontend stack of my current company.&lt;/p&gt;
&lt;p&gt;Over a decade ago, when we launched as a new digital retail bank in the Italian market, we had to choose our technology foundation. We adopted a third-party product—a widget container—that brought Angular.js along as its primary frontend framework.&lt;/p&gt;
&lt;p&gt;Fast forward ten years: hundreds of banking features have been shipped, and our architecture has ballooned into a massive fleet of &lt;strong&gt;about 450 Angular.js widgets&lt;/strong&gt;. Today, our codebase is colossal, making a traditional &quot;rip-and-replace&quot; migration look like an impossible mountain to climb.&lt;/p&gt;
&lt;p&gt;Yet, staying still is no longer an option:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Legacy Trap:&lt;/strong&gt; Critical external dependencies—including Angular.js itself—are no longer maintained, posing security and compliance risks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Architecture Friction:&lt;/strong&gt; Integrating modern architectural patterns or modern design systems is extremely hard without adopting fragile workarounds (like heavy Web Component wrappers).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Talent Crunch:&lt;/strong&gt; Hiring junior or mid-level developers has become an uphill battle. No one wants to build a career on a tech stack from 2012; the market speaks React, Vue, and modern Angular.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Our Path&lt;/h2&gt;
&lt;p&gt;During the pandemic, our internal team took the first big step toward freedom: we completely ripped out the legacy third-party widget container and replaced it with a custom, in-house solution. With that constraint gone, the Angular.js lock-in was officially broken.&lt;/p&gt;
&lt;p&gt;We faced two clear paths for the migration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Traditional Route:&lt;/strong&gt; Pick a modern framework, hire a massive IT consulting company, and spend millions of euros over a risky, 2-year rewrite—only to potentially find ourselves in the exact same legacy trap a decade from now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Engineer&apos;s Route:&lt;/strong&gt; Develop a custom solution internally, just as we successfully did for our widget container.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Driven by engineering pragmatism, &lt;strong&gt;we chose the second path.&lt;/strong&gt; Inspired by the build-time philosophy of Svelte and the fine-grained reactivity of Solid.js, we decided to build a custom compiler. Our goal? Transform legacy Angular.js HTML templates into highly optimized, modern JS modules based on fine-grained reactivity—&lt;strong&gt;without changing a single line of our existing template or controller files.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;The Core Concepts&lt;/h2&gt;
&lt;p&gt;To understand how we achieved this, let&apos;s look at how Angular.js works under the hood.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- Template --&amp;gt;
&amp;lt;p&amp;gt;Hello {{ name }}!&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// Controller
function SimpleController($scope) {
    $scope.name = &quot;Mario&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At runtime, the framework parses the template, reads the &lt;code&gt;$scope&lt;/code&gt; object, and replaces the dynamic variables to output vanilla HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;Hello Mario!&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This mechanism is driven by the Angular.js &lt;strong&gt;Digest Cycle&lt;/strong&gt;. During this cycle, the framework evaluates all dynamic expressions (interpolations between &lt;code&gt;{{&lt;/code&gt; and &lt;code&gt;}}&lt;/code&gt;) and recomputes their values to check for changes.&lt;/p&gt;
&lt;p&gt;Doing this at scale is an incredibly expensive operation. Because the browser doesn&apos;t natively know &lt;em&gt;which&lt;/em&gt; specific part of the DOM needs an update, a single property change on a &lt;code&gt;$scope&lt;/code&gt; can trigger a dirty-checking loop across the entire view.&lt;/p&gt;
&lt;h2&gt;Shifting to Build-Time: What Can We Do?&lt;/h2&gt;
&lt;p&gt;Our golden constraint was strict: &lt;strong&gt;do not touch the template or controller source code.&lt;/strong&gt; Starting from the exact same template:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- Template --&amp;gt;
&amp;lt;p&amp;gt;Hello {{ name }}!&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We built a custom template compiler (written in Go) that processes this HTML at build-time and outputs highly efficient, raw JavaScript:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Compiled JavaScript Output
function template() {
    const p_0 = document.createElement(&quot;p&quot;);
    const text_1 = document.createTextNode(&quot;&quot;);
    p_0.append(text_1);

    return {
        mount(container) {
            container.append(p_0);
        },
        update(change) {
            if (&quot;name&quot; in change) {
                text_1.data = &quot;Hello &quot; + change.name + &quot;!&quot;;
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This compiled function returns an object with two lifecycle methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mount&lt;/code&gt;: Used by our lightweight runtime to inject the element into the DOM container.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;update&lt;/code&gt;: The real heart of our framework. When a property changes, this function targets and mutates &lt;strong&gt;one specific TextNode in the DOM&lt;/strong&gt;, surgically updating the UI.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The browser no longer needs to scan the entire page. Instead, the runtime immediately knows that when &lt;code&gt;name&lt;/code&gt; changes, this exact &lt;code&gt;update&lt;/code&gt; function must be invoked.&lt;/p&gt;
&lt;p&gt;But how does the runtime intercept these changes without a digest cycle? This is where the modern &lt;strong&gt;JavaScript Proxy API&lt;/strong&gt; comes into play—and that is exactly what we will explore in the next part of this series.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Thanks for reading! I’m a Frontend Architect passionate about compilers, reactivity, and performance. Let&apos;s connect on &lt;a href=&quot;https://www.linkedin.com/in/carlostraccialini/&quot;&gt;LinkedIn&lt;/a&gt; to stay updated with the next parts of this journey.&lt;/em&gt;&lt;/p&gt;
</content:encoded><author>Carlo Straccialini</author></item><item><title>From Angular.js to Fine-Grained Reactivity: Part 2 — The JS Proxy Runtime</title><link>https://carlo-straccialini-blog.pages.dev/posts/angularjs-fine-grained-reactivity-proxy-runtime</link><guid isPermaLink="true">https://carlo-straccialini-blog.pages.dev/posts/angularjs-fine-grained-reactivity-proxy-runtime</guid><description>Using JavaScript Proxies to connect legacy Angular.js scope mutations to fine-grained template updates.</description><pubDate>Sun, 05 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the &lt;a href=&quot;/posts/angularjs-fine-grained-reactivity-compiling-templates&quot;&gt;first article&lt;/a&gt; of this series, we saw how a custom build-time compiler can transform a legacy Angular.js template into raw, optimized JavaScript.&lt;/p&gt;
&lt;p&gt;To recap, starting from this template:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- simple.html --&amp;gt;
&amp;lt;p&amp;gt;Hello {{ name }}!&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Our Go compiler generates the following JavaScript module:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// simple.js
export function template() {
    const p_0 = document.createElement(&quot;p&quot;);
    const text_1 = document.createTextNode(&quot;&quot;);
    p_0.append(text_1);

    return {
        mount(container) {
            container.append(p_0);
        },
        update(change) {
            if (&quot;name&quot; in change) {
                text_1.data = &quot;Hello &quot; + change.name + &quot;!&quot;;
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is incredibly clean. By running &lt;code&gt;template()&lt;/code&gt;, we get an object with &lt;code&gt;mount&lt;/code&gt; and &lt;code&gt;update&lt;/code&gt; methods.&lt;/p&gt;
&lt;p&gt;Using &lt;code&gt;mount&lt;/code&gt; is fully intuitive: we pass a reference to a DOM element, and it injects our empty paragraph (&lt;code&gt;p_0&lt;/code&gt;) into it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { template } from &apos;./simple.js&apos;;

const { mount, update } = template();
const container = document.getElementById(&apos;view-container&apos;);

mount(container); 
// The DOM now contains: &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt; (waiting for data)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, the paragraph remains empty until we call &lt;code&gt;update&lt;/code&gt; with a change object like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let changes = {
    name: &quot;Mario&quot;,
};

update(changes);
// The DOM surgically updates to: &amp;lt;p&amp;gt;Hello Mario!&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But who is responsible for tracking changes in our application state, building this &lt;code&gt;changes&lt;/code&gt; object, and calling &lt;code&gt;update&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;The answer lies in marrying the legacy Angular.js &lt;code&gt;$scope&lt;/code&gt; with the modern &lt;strong&gt;JavaScript Proxy API&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;The Legacy State Pattern&lt;/h2&gt;
&lt;p&gt;In a traditional Angular.js application, developers mutate the state directly inside a controller by assigning properties to the &lt;code&gt;$scope&lt;/code&gt; object:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// simple-controller.js
export function SimpleController($scope) {
    $scope.name = &quot;Mario&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To bridge the gap between this legacy controller and our new build-time template, we need a way to automatically capture the assignment &lt;code&gt;$scope.name = &quot;Mario&quot;&lt;/code&gt; and translate it into a structured update:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let changes = {
    name: &quot;Mario&quot;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead of running a heavy runtime digest cycle to dirty-check the entire scope, we can intercept these mutations at the exact moment they happen. This is where &lt;strong&gt;Proxies&lt;/strong&gt; shine.&lt;/p&gt;
&lt;h2&gt;How the JavaScript Proxy API Saves the Day&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;Proxy&lt;/code&gt; object allows us to wrap a target object and intercept fundamental operations, such as property lookups, assignments, and function invocations.&lt;/p&gt;
&lt;p&gt;By wrapping our &lt;code&gt;$scope&lt;/code&gt; in a Proxy before passing it to the controller, we can execute custom code whenever a property is set.&lt;/p&gt;
&lt;p&gt;Let&apos;s look at how we can implement a basic &lt;code&gt;set&lt;/code&gt; trap:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { SimpleController } from &apos;./simple-controller.js&apos;;

// Define a handler with a &quot;set&quot; trap
const handler = {
    set(target, prop, value) {
        console.log(`Property &quot;${prop}&quot; changed to: ${value}`);
        
        // Actually set the value on the target object
        target[prop] = value;
        
        // The set trap must return true in strict mode
        return true; 
    }
};

// Wrap an empty object with our Proxy handler
const $scope = new Proxy({}, handler);

// Run the legacy controller with our reactive scope
SimpleController($scope); 
// Console logs: Property &quot;name&quot; changed to: Mario
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every time the controller executes &lt;code&gt;$scope.name = &quot;Mario&quot;&lt;/code&gt;, our Proxy intercepts the assignment. We now have a lightweight, non-invasive mechanism to capture state mutations in real time.&lt;/p&gt;
&lt;h2&gt;Putting It All Together: The Runtime Connection&lt;/h2&gt;
&lt;p&gt;Now we can connect our Proxy-based &lt;code&gt;$scope&lt;/code&gt; directly to the &lt;code&gt;update&lt;/code&gt; method generated by our compiler.&lt;/p&gt;
&lt;p&gt;Here is the complete runtime implementation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { SimpleController } from &apos;./simple-controller.js&apos;;
import { template } from &apos;./simple.js&apos;;

// 1. Initialize the compiled template and mount it
const { mount, update } = template();
const container = document.getElementById(&apos;view-container&apos;);
mount(container);

// 2. Create the reactive $scope using a Proxy
const $scope = new Proxy({}, {
    set(target, prop, value) {
        // Intercept mutation, build the change object, and trigger the DOM update
        update({ [prop]: value });
        
        // Propagate the change to the underlying object using Reflect
        return Reflect.set(target, prop, value);
    }
});

// 3. Execute the controller to trigger the initial render
SimpleController($scope);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;The result:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The controller runs and executes &lt;code&gt;$scope.name = &quot;Mario&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Proxy intercepts the write and immediately triggers &lt;code&gt;update({ name: &quot;Mario&quot; })&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The compiled &lt;code&gt;update&lt;/code&gt; function surgically targets the &lt;code&gt;TextNode&lt;/code&gt; and updates the text to &lt;code&gt;&quot;Hello Mario!&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zero dirty-checking, zero Virtual DOM, zero external dependencies.&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;What’s Next?&lt;/h2&gt;
&lt;p&gt;While this reactive loop is extremely elegant, real-world enterprise applications are rarely this simple.&lt;/p&gt;
&lt;p&gt;What happens when a controller updates multiple properties in a row? In our current basic implementation, changing three properties sequentially would trigger three immediate, synchronous DOM repaints. To prevent layout thrashing, we need to implement a &lt;strong&gt;batching mechanism&lt;/strong&gt; to queue updates and flush them once per frame.&lt;/p&gt;
&lt;p&gt;Furthermore, how do we handle nested objects, arrays, and dependency tracking (Signals)?&lt;/p&gt;
&lt;p&gt;In the next part of this series, we will explore how we scaled this runtime architecture to handle production-grade state management. Stay tuned!&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Thanks for reading! I’m a Frontend Architect passionate about compilers, reactivity, and performance. Let&apos;s connect on &lt;a href=&quot;https://www.linkedin.com/in/carlostraccialini/&quot;&gt;LinkedIn&lt;/a&gt; to stay updated with the next parts of this journey.&lt;/em&gt;&lt;/p&gt;
</content:encoded><author>Carlo Straccialini</author></item><item><title>From Angular.js to Fine-Grained Reactivity: Part 3 — How to Optimize the Render Phase</title><link>https://carlo-straccialini-blog.pages.dev/posts/angularjs-fine-grained-reactivity-batching-updates</link><guid isPermaLink="true">https://carlo-straccialini-blog.pages.dev/posts/angularjs-fine-grained-reactivity-batching-updates</guid><description>Batching reactive scope mutations with microtasks to avoid redundant template updates and visual flicker.</description><pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the last &lt;a href=&quot;/posts/angularjs-fine-grained-reactivity-proxy-runtime&quot;&gt;article&lt;/a&gt; of this series, we saw how to use the Proxy API to notify changes to the templates. For example, this controller:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// simple-controller.js
export function SimpleController($scope) {
    $scope.name = &quot;Mario&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;produces a change like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let changes = {
    name: &quot;Mario&quot;,
};

update(changes);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Suppose now that we have a controller with multiple assignments:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// simple-controller.js
export function SimpleController($scope) {
    $scope.name = &quot;Mario&quot;;
    $scope.age = 24;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This snippet triggers multiple &lt;code&gt;update&lt;/code&gt; calls because each individual assignment produces a new change:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let changes = {
    name: &quot;Mario&quot;,
};

update(changes);

changes = {
    age: 24,
};

update(changes);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In a real-world controller, there are many more scope assignments than we&apos;ve seen in this simple example. If we consider a real enterprise app, we could have dozens of controller executions, with multiple assignments for each of them.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Another common problem we might encounter is multiple assignments to the same property; this can lead to a flickering effect on the rendered view.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// simple-controller.js
export function SimpleController($scope) {
    $scope.name = &quot;Mario&quot;;

    // Age computation can last up to 100ms
    const age = computeAge();

    $scope.name = `${$scope.name} ${age}`;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let me explain how it works.&lt;/p&gt;
&lt;p&gt;The first assignment &lt;code&gt;$scope.name = &quot;Mario&quot;&lt;/code&gt; produces a change that immediately calls the &lt;code&gt;update&lt;/code&gt; function from the template, so the view is updated. For a fraction of a second, the current user sees the string &quot;Mario&quot; on the screen.&lt;/p&gt;
&lt;p&gt;After some time, due to the computation time of the &lt;code&gt;age&lt;/code&gt; variable, the second assignment &lt;code&gt;$scope.name = \&lt;/code&gt;${$scope.name}${age}`;&lt;code&gt;is executed. This second call to the same&lt;/code&gt;update&lt;code&gt;function causes a redraw of the browser window so the user can finally see &quot;Mario 24&quot; (assuming the result of&lt;/code&gt;computeAge()` is 24).&lt;/p&gt;
&lt;p&gt;Depending on that computation time, the user might actually see this visual flickering, making it a real risk for the user experience.&lt;/p&gt;
&lt;h2&gt;Solution: Queueing Mutations via Microtasks&lt;/h2&gt;
&lt;p&gt;An elegant solution to this problem comes from the event loop and the microtask queue.&lt;/p&gt;
&lt;p&gt;I&apos;m sure that many of you are familiar with concepts like Promises, &lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;, and async JavaScript in general. And obviously, you also know the &quot;magic&quot; event loop and how it works. But microtasks? What are they?&lt;/p&gt;
&lt;p&gt;A microtask is a function that runs after the calling function has returned, but before the event loop moves to the next tick and checks its macrotask queue. In particular, in a browser environment, it runs before the view is updated with the new values.&lt;/p&gt;
&lt;p&gt;To learn more about microtasks, you can study this &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide&quot;&gt;article&lt;/a&gt; on the MDN docs.&lt;/p&gt;
&lt;p&gt;To solve the problem of multiple mutations, we can simply merge all the changes before calling the &lt;code&gt;update&lt;/code&gt; function. In the next section, you can see a simple implementation of these two concepts.&lt;/p&gt;
&lt;h2&gt;Building the Batching Engine&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;let pendingChanges = {};
let isScheduled = false;

function scheduleUpdate(change, updateFn) {
    // Merge changes (overwriting previous values for the same key -&amp;gt; solves flickering!)
    Object.assign(pendingChanges, change);

    if (!isScheduled) {
        isScheduled = true;
        queueMicrotask(() =&amp;gt; {
            updateFn(pendingChanges);
            pendingChanges = {};
            isScheduled = false;
        });
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Our proxies must now call this new &lt;code&gt;scheduleUpdate&lt;/code&gt; method instead of calling the &lt;code&gt;update&lt;/code&gt; function directly when they intercept a &lt;code&gt;set&lt;/code&gt; operation.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Object.assign&lt;/code&gt; solves the problem of multiple mutations to the same key because it always overwrites the global &lt;code&gt;pendingChanges&lt;/code&gt; object with the latest change. Then, a microtask that will eventually call the real &lt;code&gt;update&lt;/code&gt; function is enqueued.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;isScheduled&lt;/code&gt; variable acts as a guard to avoid enqueuing multiple redundant microtasks with an empty &lt;code&gt;pendingChanges&lt;/code&gt; object.&lt;/p&gt;
&lt;h2&gt;Conclusion &amp;amp; What&apos;s Next&lt;/h2&gt;
&lt;p&gt;We have just solved the problem of multiple mutations within the same controller execution, so does everything work perfectly now? Not quite... if you think about it for a minute, you might guess our next challenge.&lt;/p&gt;
&lt;p&gt;What happens with &lt;code&gt;$scope.person.name = &apos;Mario&apos;&lt;/code&gt;? Until now, we only support changes on top-level properties, but here we are updating a nested property. We will encounter the exact same problem with arrays.&lt;/p&gt;
&lt;p&gt;In the next article, we&apos;ll dive into how to track, solve, and notify this kind of deep changes.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Thanks for reading! I’m a Frontend Architect passionate about compilers, reactivity, and performance. Let&apos;s connect on &lt;a href=&quot;https://www.linkedin.com/in/carlostraccialini/&quot;&gt;LinkedIn&lt;/a&gt; to stay updated with the next parts of this journey.&lt;/em&gt;&lt;/p&gt;
</content:encoded><author>Carlo Straccialini</author></item></channel></rss>