<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniel Glejzner</title>
    <description>The latest articles on DEV Community by Daniel Glejzner (@danielglejzner).</description>
    <link>https://dev.to/danielglejzner</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1023045%2F246593bd-3f6e-4494-886d-03ef535539c8.jpeg</url>
      <title>DEV Community: Daniel Glejzner</title>
      <link>https://dev.to/danielglejzner</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danielglejzner"/>
    <language>en</language>
    <item>
      <title>Always unsubscribe. No exceptions. Debate closed.</title>
      <dc:creator>Daniel Glejzner</dc:creator>
      <pubDate>Thu, 11 Apr 2024 21:16:37 +0000</pubDate>
      <link>https://dev.to/playfulprogramming-angular/always-unsubscribe-no-exceptions-debate-closed-205n</link>
      <guid>https://dev.to/playfulprogramming-angular/always-unsubscribe-no-exceptions-debate-closed-205n</guid>
      <description>&lt;p&gt;So many years with Angular. &lt;br&gt;
So many years with RxJS. &lt;/p&gt;

&lt;p&gt;Yet people still fight over "when NOT to unsubscribe". &lt;/p&gt;

&lt;h2&gt;
  
  
  Truth is. It's not even worth the conversation.
&lt;/h2&gt;

&lt;p&gt;Just unsubscribe always. Simple. &lt;/p&gt;

&lt;p&gt;I have recently posted the same advice on my social media(X/LinkedIn).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F069laxi94028ff233kha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F069laxi94028ff233kha.png" alt=" " width="800" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F452jk1feresf27k43o8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F452jk1feresf27k43o8c.png" alt=" " width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While majority agreed without a doubt. About 10% decided that it's a perfect opportunity to showcase deep and expert knowledge of how there is NO NEED to always unsubscribe. &lt;/p&gt;

&lt;p&gt;The prime and crown example: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HttpClient cold observable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have been told that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's a terrible advice&lt;/li&gt;
&lt;li&gt;It's a big overhead to always unsubscribe&lt;/li&gt;
&lt;li&gt;People should never follow this advice&lt;/li&gt;
&lt;li&gt;It's absolutely wrong &lt;/li&gt;
&lt;li&gt;It's redundant code&lt;/li&gt;
&lt;li&gt;It's a bold assumption&lt;/li&gt;
&lt;li&gt;Go ask Angular Team and so on...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes technically HttpClient completes automatically in like 99% of cases. &lt;/p&gt;

&lt;p&gt;However this doesn't mean that you have to deliberately find and safe guard places where you subscribe to HttpClient Observable to avoid unsubscribing. &lt;/p&gt;

&lt;h2&gt;
  
  
  Simple "Why":
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It doesn't make any sense&lt;/li&gt;
&lt;li&gt;There is 0 overhead to unsubscribe since you have to do it in other places as well ( should be in your blood already cmon!" &lt;/li&gt;
&lt;li&gt;Value consistency over "being smart about things"&lt;/li&gt;
&lt;li&gt;Never think about when not to unsubscribe and focus on important things. &lt;/li&gt;
&lt;li&gt;Value consistency...&lt;/li&gt;
&lt;li&gt;Value consistency...&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Not convinced? Advanced "Why":
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Citing a friend, because i could have not put it together in a batter way: &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyna8d7l0sluzwj10u5r8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyna8d7l0sluzwj10u5r8.png" alt=" " width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Additionally this conversation has been "silently" resolved in one of the GitHub issues from 2022. Feedback from "Engineering" means response from devs. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgt3k6xxvy9lmvpijcgx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgt3k6xxvy9lmvpijcgx.png" alt=" " width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;source: &lt;a href="https://github.com/angular/angular/issues/46542" rel="noopener noreferrer"&gt;https://github.com/angular/angular/issues/46542&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;And finally in new Angular docs website. It's clearly stated that: &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Once the response returns, Observables from HttpClient usually complete (although interceptors can influence this).&lt;/p&gt;

&lt;p&gt;Because of the automatic completion, there is usually no risk of memory leaks if HttpClient subscriptions are not cleaned up. &lt;strong&gt;However, as with any async operation, we strongly recommend that you clean up subscriptions when the component using them is destroyed&lt;/strong&gt;, as the subscription callback may otherwise run and encounter errors when it attempts to interact with the destroyed component.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;source: &lt;a href="https://angular.dev/guide/http/making-requests#http-observables" rel="noopener noreferrer"&gt;https://angular.dev/guide/http/making-requests#http-observables&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can use this resource if your teammates keep nitpicking that you are unsubscribing from HttpClient Observables. Or any other they think it's "safe" not to do it.&lt;/p&gt;

&lt;p&gt;Tip: Avoid subscribing in first place, do everything to end up with async pipe.&lt;/p&gt;

&lt;p&gt;PS: as of Angular v16 - the best way to unsubscribe is by using takeUntilDestroyed()&lt;/p&gt;

&lt;p&gt;Like my stuff? Follow me on LinkedIn or &lt;a href="https://twitter.com/DanielGlejzner" rel="noopener noreferrer"&gt;X&lt;/a&gt;&lt;br&gt;
Big things happening at &lt;a href="https://wwww.angularspace.com" rel="noopener noreferrer"&gt;angularspace.com&lt;/a&gt; ( Early Access )&lt;/p&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>rxjs</category>
    </item>
    <item>
      <title>⭐ Angular Space Writer Mentorship Program</title>
      <dc:creator>Daniel Glejzner</dc:creator>
      <pubDate>Wed, 27 Mar 2024 14:00:14 +0000</pubDate>
      <link>https://dev.to/playfulprogramming-angular/angular-space-writer-mentorship-program-2dpg</link>
      <guid>https://dev.to/playfulprogramming-angular/angular-space-writer-mentorship-program-2dpg</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl7abauy4d81iulxbz7st.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl7abauy4d81iulxbz7st.png" alt=" " width="800" height="619"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Announcing the Angular Space Writer Mentorship Program&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Exclusive to Angular Space Registered Members!
&lt;/h2&gt;

&lt;p&gt;I’m thrilled to announce the &lt;strong&gt;Angular Space Writer Mentorship Program&lt;/strong&gt;, where community members can transform their article ideas into educational masterpieces &lt;strong&gt;with the help of industry experts.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works 👇
&lt;/h2&gt;

&lt;h2&gt;
  
  
  #1 Submit Your Idea
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use a form to &lt;strong&gt;propose the article&lt;/strong&gt;💡 you want to write for Angular Space ( To be published soon).&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We are going to take limited amount of ideas in phases &lt;br&gt;
&lt;strong&gt;to ensure that you are taken care of!&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If we reject your idea you are going to receive explanation why and guidelines for selecting new idea! ( &lt;strong&gt;First Learning opportunity&lt;/strong&gt; ) 🧑‍🎓&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  #2 Technical Review
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Once your article idea is approved, &lt;strong&gt;you need to send us a draft&lt;/strong&gt; focusing on technical educational value you want to pass ( focus on code 😄 ).&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One (or multiple) &lt;strong&gt;Technical Mentors ⭐ is/are going to take care of you from now on&lt;/strong&gt; to validate the technical correctness of the code and the concept. Ensure that the content is suitable for an article and will truly educate our readers.&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You are already in the process, &lt;strong&gt;every mistake you make will be a learning opportunity 🧑‍🎓&lt;/strong&gt;.&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You are going to cooperate with Mentors until the result is satisfying. &lt;strong&gt;Mentors are going to be there to help you with every question and doubt!&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  #3 Content Delivery Review
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;After passing the Technical Review, we know the code is solid, and the technical message is educational.&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now, &lt;strong&gt;Content Delivery&lt;/strong&gt; &lt;strong&gt;Mentors&lt;/strong&gt; ⭐ work on clarifying descriptions, improving content delivery, adding impactful titles, and &lt;strong&gt;ensuring the article is both engaging, informative and well structured.&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This is a crucial part that many don’t fulfil in a correct way. **You also need to learn to sell 💰 **your technical expertise so it impacts highest amount of devs along the way. More fun and engaging = more views.&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“But Views and Likes are not important or a metric of good article” — correct ✅. However &lt;strong&gt;without views/likes your content is going to have limited reach&lt;/strong&gt; and your educational effort is going to impact small amount of devs ☹️…&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the fun and engaging part is ✅, &lt;strong&gt;you attracted many to read&lt;/strong&gt;. Your content now get’s exposed to the it’s foundational core. The technical/educational part — the part you value the most!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  #4 Final Review
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The article undergoes a comprehensive review of both its technical and content delivery elements. Final touches are added if needed and it’s queued for publication! 👏&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  High-Level Vision 👁️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvcqfg47p5qaee6mgoi88.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvcqfg47p5qaee6mgoi88.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Win-Win-Win 🏆
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We aim for impact, leveraging our expertise to maximize contributions to the open-source community. Your article will not only be a learning experience for you but also a valuable asset for Angular Space and the tech community.&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As you navigate through each stage of the process, you’ll refine your technical knowledge, learn from any mistakes, and improve upon your original ideas.&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Learn to write in a way that is technically sound and accessible, creating content that readers can understand, enjoy, and trust.&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mentors will practice and enhance their mentoring skills, ensuring the high quality of the content published under Angular Space’s name.&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Angular Space gains insightful educational content, while the tech community can rely on these articles to be credible and valuable, thanks to the mentorship seal of approval.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Everyone wins! Everyone gains something in the process 😃&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And of course, when your article is ready for publication, not only will your name be featured as the author, but the mentors who’ve supported and guided you will also be acknowledged for their contributions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can publish your work on dev/medium etc. We do not own any rights to your content. We are going to ask you for courtesy Angular Space Mentorship Program info placement + Mentors who reviewed your article at the end when you decide to publish in different places as well.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Join us in this unique mentorship opportunity to write, learn, and make a lasting impact!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Join us now! --&amp;gt; &lt;a href="https://www.angularspace.com/" rel="noopener noreferrer"&gt;https://www.angularspace.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;or join waitlist directly! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://tally.so/r/wMzALE" rel="noopener noreferrer"&gt;https://tally.so/r/wMzALE&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I’m going to publish the registration form soon! Make sure to keep an eye on Angular Space, E-mails, my tweets/posts on X 😎
&lt;/h2&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What is Angular Query?</title>
      <dc:creator>Daniel Glejzner</dc:creator>
      <pubDate>Sat, 03 Feb 2024 22:43:14 +0000</pubDate>
      <link>https://dev.to/playfulprogramming-angular/what-is-angular-query-276f</link>
      <guid>https://dev.to/playfulprogramming-angular/what-is-angular-query-276f</guid>
      <description>&lt;h2&gt;
  
  
  Short breakdown 👇
&lt;/h2&gt;

&lt;p&gt;Angular Query is used for syncing server data with client applications.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Without any unneeded abstractions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal for&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;grids&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tables&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;listings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;etc…&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  We have 2 packages to look at
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;ngneat/query&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tanstack/angular-query-experimental&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ngneat is unofficial adapter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;supporting RxJS &amp;amp; Signals by &lt;a href="https://twitter.com/ngneat_org" rel="noopener noreferrer"&gt;@ngneat_org&lt;/a&gt; 
&lt;a href="https://twitter.com/NetanelBasal" rel="noopener noreferrer"&gt;@NetanelBasal&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TanStack one is official
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;developed by &lt;a href="https://twitter.com/Arnoud_dv" rel="noopener noreferrer"&gt;@Arnoud_dv&lt;/a&gt; &lt;a href="https://twitter.com/tan_stack" rel="noopener noreferrer"&gt;@tan_stack&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;for now supports only Signals&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RxJS support planned for the future&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are using &lt;strong&gt;TanStack Query Core.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🟨 Core Concepts 🟨
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Queries&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Declaratively manage data fetching.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Letting Angular Query handle the timing and specifics of server communication.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Mutations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Handle data modification&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrating queries for a consistent data management&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧹 Cache &amp;amp; Cleanup 🧹
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Cache Management&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data maintenance and retrieval is handled by Query Client &amp;amp; Query Cache.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Query Keys&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A system for identifying and managing data dependencies across components.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. SWR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensures data freshness by smartly revalidating data behind the scenes without sacrificing performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💻 Significant DX improvements 💻
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Reduced boilerplate Out of the box&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Intelligent caching and data management strategies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Giant performance boost in writing async code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pairs fantastic with component state management libraries&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Basic usage with ngneat/query:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Service usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;injectQuery&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@ngneat/query&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TodosService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;HttpClient&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;injectQuery&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="nf"&gt;getTodos&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;queryKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;todos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;queryFn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Todo&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jsonplaceholder.typicode.com/todos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Component usage with &lt;strong&gt;Observables&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
        @if (todos.result$ | async; as result) {
          @if (result.isLoading) {
            &amp;lt;p&amp;gt;Loading&amp;lt;/p&amp;gt;
          }
          @if (result.isSuccess) {
            &amp;lt;p&amp;gt;{{ result.data[0].title }}&amp;lt;/p&amp;gt;
          }
          @if (result.isError) {
            &amp;lt;p&amp;gt;Error&amp;lt;/p&amp;gt;
          }
        }
      `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TodosPageComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;todos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;TodosService&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;getTodos&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Component usage with &lt;strong&gt;Signals&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
        @if (todos().isLoading) {
          Loading
        }
        @if (todos().data; as data) {
          &amp;lt;p&amp;gt;{{ data[0].title }}&amp;lt;/p&amp;gt;
        }
        @if (todos().isError) {
          &amp;lt;p&amp;gt;Error&amp;lt;/p&amp;gt;
        }
      `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TodosPageComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;todos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;TodosService&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;getTodos&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Docs:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ngneat: &lt;a href="https://github.com/ngneat/query" rel="noopener noreferrer"&gt;https://github.com/ngneat/query&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TanStack: &lt;a href="https://tanstack.com/query/latest/docs/framework/angular/overview" rel="noopener noreferrer"&gt;https://tanstack.com/query/latest/docs/framework/angular/overview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on X for more: &lt;a href="https://twitter.com/DanielGlejzner" rel="noopener noreferrer"&gt;https://twitter.com/DanielGlejzner&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>4 Laws of RxJS Observables</title>
      <dc:creator>Daniel Glejzner</dc:creator>
      <pubDate>Thu, 02 Nov 2023 13:16:28 +0000</pubDate>
      <link>https://dev.to/playfulprogramming-angular/4-laws-of-rxjs-observables-4a5c</link>
      <guid>https://dev.to/playfulprogramming-angular/4-laws-of-rxjs-observables-4a5c</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6qu79khp651e0g0nn81y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6qu79khp651e0g0nn81y.png" alt=" " width="800" height="776"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is crucial to understand! Online materials can often be incorrect.&lt;/p&gt;

&lt;p&gt;Very short but meaty writeup.&lt;/p&gt;

&lt;h2&gt;
  
  
  🏆 Here are 4 Laws of Observables 🏆
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Law 1
&lt;/h3&gt;

&lt;p&gt;• All Observables are lazy, without exception.&lt;/p&gt;

&lt;h3&gt;
  
  
  Law 2
&lt;/h3&gt;

&lt;p&gt;• Observables are either cold, serving a single execution context per subscription in a unicast manner.&lt;/p&gt;

&lt;p&gt;• Or hot, serving one or more subscribers with the same execution context, in a multicast manner.&lt;/p&gt;

&lt;h3&gt;
  
  
  Law 3
&lt;/h3&gt;

&lt;p&gt;• Subject is both an Observable and an Observer&lt;/p&gt;

&lt;p&gt;• The Observable part is multicast, but still lazily executed only when the first subscriber comes.&lt;/p&gt;

&lt;p&gt;• The Observer part is the one created eagerly that allows us to call .next() and send data through the Subject; &lt;/p&gt;

&lt;p&gt;• The Observer part does not imply that the execution context of the Observable is 'alive' before the first subscription is made.&lt;/p&gt;

&lt;h3&gt;
  
  
  Law 4
&lt;/h3&gt;

&lt;p&gt;• There are stateful Subjects, like BehaviorSubject or ReplySubject, which extend the Observer part.&lt;/p&gt;

&lt;p&gt;• Adding support for holding 1..n previous states, which the Observable part will multicast to potential subscribers.&lt;/p&gt;




&lt;p&gt;By reading this, do you think that RxJS is a complex subject (pun intended :D)?&lt;/p&gt;

&lt;p&gt;Angular Team announced plans to potentially make RxJS optional in the future.&lt;/p&gt;

&lt;p&gt;Would you like to keep RxJS mandatory?&lt;br&gt;
Or optional is the right way to go?&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>rxjs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Microtask Queue + RxJS + Angular</title>
      <dc:creator>Daniel Glejzner</dc:creator>
      <pubDate>Sat, 07 Oct 2023 05:04:44 +0000</pubDate>
      <link>https://dev.to/playfulprogramming-angular/microtask-queue-rxjs-angular-38ah</link>
      <guid>https://dev.to/playfulprogramming-angular/microtask-queue-rxjs-angular-38ah</guid>
      <description>&lt;h2&gt;
  
  
  The What, When, and Why
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqts6duw3au8fb0i41jm5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqts6duw3au8fb0i41jm5.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When working with Angular, you can experience &lt;strong&gt;complex mechanisms that are not initially visible&lt;/strong&gt;. When understood, can significantly enhance your application’s performance. &lt;/p&gt;

&lt;p&gt;Learn about interplay between the &lt;strong&gt;Microtask Queue, RxJS, and Angular’s&lt;/strong&gt; change detection mechanism.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mo02kdzyld6x6qfjv1f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mo02kdzyld6x6qfjv1f.png" alt="Image source: github.com/TheAlgorithms/JavaScript" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Microtask vs. Macrotask
&lt;/h2&gt;

&lt;p&gt;Before diving deep, it’s essential to differentiate between &lt;strong&gt;microtasks&lt;/strong&gt; and &lt;strong&gt;macrotasks&lt;/strong&gt;. Observables, a core part of RxJS, &lt;strong&gt;are microtasks in async scenario.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This ensures they execute quicker than macrotasks, such as setTimeout. But why does this matter?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F848azecta1sg4c78emmy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F848azecta1sg4c78emmy.png" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  RxJS and Asynchronicity
&lt;/h2&gt;

&lt;p&gt;Observable values (async scenario) in RxJS &lt;strong&gt;are processed after promises.&lt;/strong&gt; This sequence affects the execution order, which can be crucial &lt;strong&gt;when dealing with asynchronous operations.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbqk9v8qggir0imjrirs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbqk9v8qggir0imjrirs.png" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular’s Change Detection
&lt;/h2&gt;

&lt;p&gt;Angular’s change detection mechanism is designed to run &lt;strong&gt;after the microtask queue is emptied.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This ensures that the view updates only &lt;strong&gt;after all the microtasks, including observables, have been processed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s a subtle yet powerful design choice that ensures consistency in the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Role of Zone.js
&lt;/h2&gt;

&lt;p&gt;Zone.js plays a significant role. It &lt;strong&gt;monitors asynchronous operations&lt;/strong&gt; and ensures that Angular’s &lt;strong&gt;change detection is triggered post the completion of microtasks.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;RootZone (outerZone)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;At the foundation of Zone.js is the root zone. This is the &lt;strong&gt;top-level zone that provides the basic mechanisms&lt;/strong&gt; to track asynchronous operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Forking and Hierarchical Structure&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Zones in Zone.js are hierarchical. This means that &lt;strong&gt;new zones are created by "forking" an existing zone&lt;/strong&gt;. When you fork a zone, the &lt;strong&gt;new zone inherits the behaviours&lt;/strong&gt; of its parent but can also have additional behaviours or modifications. &lt;/p&gt;

&lt;p&gt;This hierarchical structure &lt;strong&gt;allows for a cascading system&lt;/strong&gt; where child zones can benefit &lt;strong&gt;from the tracking mechanisms of their parent zones&lt;/strong&gt; while also introducing specific behaviours.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;NgZone (innerZone)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In the context of Angular, the framework doesn’t directly use the root zone. Instead, &lt;strong&gt;Angular creates its specialized zone by forking the root zone&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;This forked zone, known as NgZone or sometimes referred to as the "inner zone," is augmented with Angular-specific behaviors. It's within this NgZone that Angular &lt;strong&gt;tracks changes and decides when to run its change detection.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The ability to fork zones and create this hierarchical structure is powerful. It allows for modular and layered tracking of asynchronous operations. &lt;/p&gt;

&lt;p&gt;For instance, while the root zone might provide basic tracking, &lt;strong&gt;child zones (like NgZone) can introduce application-specific behaviors&lt;/strong&gt; without affecting the broader tracking mechanisms.&lt;/p&gt;

&lt;p&gt;In Angular’s case, the NgZone ensures that the framework can efficiently track changes and update the UI, building upon the foundational capabilities of the root zone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F924by8fj803llyc5se1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F924by8fj803llyc5se1y.png" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Typical Sequence
&lt;/h2&gt;

&lt;p&gt;Let’s break down a typical sequence of events:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A user interacts, perhaps with a button click.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This interaction triggers an event.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An API call is made in response.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Promises and Observables (async scenario) are pushed into the Microtask Queue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Functions scheduled with setTimeout go into the Macrotask Queue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Within the Microtask Queue, promises resolve first.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Observables then emit their values.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data is processed using RxJS operators.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Angular checks for changes in the data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The UI is updated with fresh data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, functions in the Macrotask Queue, like those scheduled with setTimeout, execute.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Not that hard huh?
&lt;/h2&gt;

&lt;p&gt;The interplay between the Microtask Queue, RxJS, and Angular is a complex work of internal mechanisms. &lt;/p&gt;

&lt;p&gt;But understanding this is invaluable. It not only aids in performance optimizations but also helps in resolving potential race conditions. &lt;/p&gt;

&lt;p&gt;These nuances can make the difference between a good application and a great one.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>rxjs</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Angular is getting New Template Syntax</title>
      <dc:creator>Daniel Glejzner</dc:creator>
      <pubDate>Sat, 01 Jul 2023 10:44:51 +0000</pubDate>
      <link>https://dev.to/playfulprogramming-angular/angular-is-getting-new-template-syntax-4naf</link>
      <guid>https://dev.to/playfulprogramming-angular/angular-is-getting-new-template-syntax-4naf</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmnpvy2pmo361qlhr0jxd.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmnpvy2pmo361qlhr0jxd.jpeg" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update 2023–10–07: I have updated this to the final syntax form with @&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;New Template Syntax, Built-In Control Flow, a farewell to structural directives? Not a lot has been changing in recent years. &lt;strong&gt;Angular has been stable for some devs and stagnant for others.&lt;/strong&gt; &lt;strong&gt;Now it’s moving forward at light speed.&lt;/strong&gt; But where exactly is it headed?&lt;/p&gt;

&lt;p&gt;Angular proposes a &lt;strong&gt;transition from the current structural directives&lt;/strong&gt; (NgIf, NgForOf, NgSwitch) &lt;strong&gt;to a new built-in syntax&lt;/strong&gt;. If you’re not already following the &lt;a href="https://github.com/angular/angular/discussions/50719" rel="noopener noreferrer"&gt;RFCs (Request for Comments)&lt;/a&gt;, please do. In meantime I am going to help you understand what’s coming.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0um4set8157ot518s1s4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0um4set8157ot518s1s4.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Revamping Control Flow
&lt;/h2&gt;

&lt;p&gt;Angular team aims to replace the existing structural directives (&lt;strong&gt;NgIf, NgForOf, and NgSwitch&lt;/strong&gt;) with a more modern, macro-like syntax. While the structural directives are not going away completely, because the concept is going to stay — &lt;strong&gt;this new way of writing your template is going to be the preferred one&lt;/strong&gt;. It’s &lt;strong&gt;backwards compatible&lt;/strong&gt; and for some time you are going to be able to use both old template style and new one in different files.&lt;/p&gt;

&lt;p&gt;Change aims to cover better readability and provide smother way to adapt for wider audience in Frontend world.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Before&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;trackByFunction&lt;/strong&gt; in Angular is a custom function used for optimizing performance when iterating over large collections using &lt;code&gt;*ngFor&lt;/code&gt;. In current syntax it takes only a function, in new way it’s going to work just with properties.&lt;/p&gt;

&lt;p&gt;Angular will track changes in the collection based on each item’s &lt;strong&gt;id&lt;/strong&gt;, instead of its identity. This is useful when items in the collection have unique ids, improving efficiency when the collection is updated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    trackByFunction(index, item) {
      return item.id;
    }

    &amp;lt;div *ngFor="let item of items; index as idx; trackBy: trackByFunction"&amp;gt;
      Item #{{ idx }}: {{ item.name }}
    &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@for (item of items; track item.id; let idx = $index, let e = $even) 
{
  Item #{{ idx }}: {{ item.name }}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This new syntax is keeping several implicit variables like &lt;strong&gt;$index, $first, $last, $even, and $odd&lt;/strong&gt; within for row views. These are available for use directly, but can also be aliased using the ‘let’ segment. The new syntax also emphasizes using ‘track’ for loops to improve performance and optimizes list diffing by enforcing tracking.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@for (item of items; track item.id) 
{
  {{ item }}
} 
@empty 
{
  There were no items in the list.
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One crucial feature introduced is the &lt;strong&gt;‘empty’ block which allows developers to display a template when there are no items in the list&lt;/strong&gt;. Also, Angular is changing how it handles list diffing. Rather than using the customizable IterableDiffers, Angular will provide a new optimized algorithm for better performance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgimqzgtukbmh1rkbc3yc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgimqzgtukbmh1rkbc3yc.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  If-Else Blocks
&lt;/h2&gt;

&lt;p&gt;If you found the original way of working with &lt;strong&gt;ng-container&lt;/strong&gt; &amp;amp; &lt;strong&gt;ng-template&lt;/strong&gt; alongside &lt;code&gt;*ngIf&lt;/code&gt; structural directive not intuitive enough — New Control Flow might have an answer for your troubles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before (in theory)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;ng-container *ngIf="cond.expr; else elseBlock"&amp;gt;
      Main case was true!
    &amp;lt;/ng-container&amp;gt;

    &amp;lt;ng-template #elseBlock&amp;gt;
      &amp;lt;ng-container *ngIf="other.expr; else finalElseBlock"&amp;gt;
        Extra case was true!
      &amp;lt;/ng-container&amp;gt;

    &amp;lt;/ng-template&amp;gt;
    &amp;lt;ng-template #finalElseBlock&amp;gt;
      False case!
    &amp;lt;/ng-template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@if (cond.expr) 
{
  Main case was true!
} 
@else if (other.expr) 
{
  Extra case was true!
} 
@else 
{
  False case!
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jb7l5l0rhllwu4usbhm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jb7l5l0rhllwu4usbhm.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Switch Block
&lt;/h2&gt;

&lt;p&gt;The ‘switch’ block takes place of &lt;code&gt;*ngSwitch&lt;/code&gt; which. New way of writing is said to bring in substantial benefits like enhanced template type-checking and no need for container elements to hold condition expressions. Here’s a quick peek at how it would look:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@switch (condition) 
{
  @case (caseA) 
  {
    Case A.
  }
  @case (caseB) 
  {
    Case B.
  }
  @default 
  {
    Default case.
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fud5sr92900vuwxlhg1pv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fud5sr92900vuwxlhg1pv.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Migration?
&lt;/h2&gt;

&lt;p&gt;Migration to the new syntax is promised be relatively smooth. &lt;strong&gt;Angular team is working on an automated migration schematic&lt;/strong&gt; to convert from the old to the new syntax. However, developers might need to be cautious about any custom diffing algorithm used in their applications as it could affect the new ‘for’ directive’s behavior.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foapbh4umlmqispud4x76.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foapbh4umlmqispud4x76.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Opportunities
&lt;/h2&gt;

&lt;p&gt;The Angular team envisions extending this new syntax to accommodate more JS loop flavors, including async iteration, and for-in loops. Potential future improvements also include virtual scrolling and destructuring support.&lt;/p&gt;

&lt;p&gt;There is also another RFC showing new feature in action — this feature is based new Built-In Control Flow. Checkout RFC for &lt;a href="https://github.com/angular/angular/discussions/50716" rel="noopener noreferrer"&gt;Deferred Loading&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67ve9klbme9fyf6qexiv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67ve9klbme9fyf6qexiv.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ Recap
&lt;/h2&gt;

&lt;p&gt;Let’s quickly address some common concerns developers might have about this new control flow syntax:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Existing structural directives:&lt;/strong&gt; The current structural directives (NgIf, etc) will continue to work. However, Angular will strongly encourage developers to switch to the new syntax.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structural directive concept&lt;/strong&gt;: It will not be removed and remains an essential feature in Angular.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Syntax highlighting&lt;/strong&gt;: Yes, the Angular Language Service will highlight keywords and expressions within the new control flow blocks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Effect on query results&lt;/strong&gt;: The new control flow will not affect query results.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Need to import new control flow&lt;/strong&gt;: No, it will be built into the template language and automatically available to all components.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;: The new control flow might offer marginal improvements, particularly for ‘for’ and diffing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom block groups and directives&lt;/strong&gt;: At present, the new syntax doesn’t support libraries to define custom block groups, and you can’t add directives to the new control flow blocks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dc9o970qnyp10pgibxv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dc9o970qnyp10pgibxv.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What do you think?
&lt;/h2&gt;

&lt;p&gt;This proposed syntax change is going to affect the way you write your templates. Do you think it’s needed? Is this change going to improve your DX and bring new devs aboard that prevously preferred to use different frameworks?&lt;/p&gt;

&lt;p&gt;My main concerns lie within the &lt;strong&gt;transition period&lt;/strong&gt;. We have a significant &lt;strong&gt;change in reactive primitive with Signals&lt;/strong&gt; and &lt;strong&gt;now new Template Syntax&lt;/strong&gt; is being introduced. It’s definitely coming together to paint a bigger picture that hasn’t been unveiled to us yet. &lt;strong&gt;For some time Angular devs are going to get many options to handle reactivity&lt;/strong&gt;: RxJS, Signals, Promises, Change Detection (zone.js) + 2 ways of writing templates.&lt;/p&gt;

&lt;p&gt;It will definitely take a long time to fully transition to the new vision and it’s not like you can speed this process up. Now the question would be, is the cost of these advancements worth what we are getting in the end?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make sure to let me know and have a discussion!&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  I hope you liked my article!
&lt;/h3&gt;

&lt;p&gt;If you did you might also like what I am doing on &lt;strong&gt;Twitter&lt;/strong&gt;. I am hosting live Twitter Spaces about Angular with GDEs &amp;amp; industry experts! You can participate live, ask your questions or watch replays in a form of short clips :)&lt;/p&gt;

&lt;p&gt;If you are interested drop me a follow on &lt;strong&gt;Twitter &lt;a href="https://twitter.com/DanielGlejzner" rel="noopener noreferrer"&gt;@DanielGlejzner&lt;/a&gt; — would mean a lot :). Thank You!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Oh no! My Coffee cup is empty :( …&lt;br&gt;
… if you want to refill go ahead :) &lt;a href="https://ko-fi.com/danielglejzner" rel="noopener noreferrer"&gt;https://ko-fi.com/danielglejzner&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Angular with Nx in 2023? Seriously, You Should!</title>
      <dc:creator>Daniel Glejzner</dc:creator>
      <pubDate>Wed, 24 May 2023 06:30:00 +0000</pubDate>
      <link>https://dev.to/playfulprogramming-angular/angular-with-nx-in-2023-seriously-you-should-480j</link>
      <guid>https://dev.to/playfulprogramming-angular/angular-with-nx-in-2023-seriously-you-should-480j</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs2olvelbegdyr9jvwota.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs2olvelbegdyr9jvwota.jpeg" alt="By MidJourney AI" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Honestly, it’s hard for me see why you wouldn’t want to use Nx for your Angular application. &lt;strong&gt;And no, you don’t need a monorepo.&lt;/strong&gt; Let me break it down for you.&lt;/p&gt;

&lt;p&gt;A lot of people find it tough to set up a folder structure and app architecture that’s easy to use, can grow over time, and can be managed by a big team. &lt;strong&gt;This is tough for polyrepos and even tougher for monorepos.&lt;/strong&gt; But whether you’re working with a polyrepo or a monorepo, &lt;strong&gt;Nx can help you out.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbmcytqc8l1gl56zoaar.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbmcytqc8l1gl56zoaar.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Briefly — What is Nx?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Nx is a powerful open-source build system that provides tools and techniques for enhancing developer productivity, optimizing CI performance, and maintaining code quality. — &lt;a href="https://nx.dev/getting-started/intro" rel="noopener noreferrer"&gt;Nx docs&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I pulled this straight from the official documents. To me, &lt;strong&gt;Nx is like a trusty foundation stone for any Angular app architecture.&lt;/strong&gt; I’ve built a ton of apps using Nx — and let me tell you, &lt;strong&gt;it’s like having a helpful buddy along the way.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Nx nudges you into:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Structuring your codebase into well-defined modules for better manageability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensuring a consistent setup through the systematic use of code generation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoiding the potential pitfalls of messy dependencies that could compromise the maintainability of your code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Helping you automatically visualize your structure through dependency graph and much much more.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While Nx lays the groundwork for success, it doesn’t promise a win. &lt;strong&gt;It’s still up to you to stick with the best practices&lt;/strong&gt;, pick a method that’s proven in battle (like DDD or FDD), and define &lt;a href="https://nx.dev/packages/eslint-plugin/documents/enforce-module-boundaries" rel="noopener noreferrer"&gt;*&lt;em&gt;module boundaries&lt;/em&gt;&lt;/a&gt;, and so on.&lt;/p&gt;

&lt;p&gt;Once you’ve got everything set up just right, &lt;strong&gt;adding new features and growing your app is a piece of cake&lt;/strong&gt;. But let’s start with a first step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5a70vx3i2wz8cojncpv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5a70vx3i2wz8cojncpv.png" alt="By MidJourney AI" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Big Decision
&lt;/h2&gt;

&lt;p&gt;Software projects can be big, small, simple, complex, and have different team setups. So, &lt;strong&gt;deciding how to set up your project really depends on a few things&lt;/strong&gt; like how big your team is, how many apps you’re building, the size of your codebase, and how much code you’re sharing between projects.&lt;/p&gt;

&lt;p&gt;Choosing between a polyrepo and a monorepo is a big decision and it’s something &lt;strong&gt;your team should sit down and chat about with your lead or architect&lt;/strong&gt;. It’ll be even better if that person knows their way around Angular applications, team setups, workflows, and all those high-level bits and pieces.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vnkg05if2l8u1pkx41c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vnkg05if2l8u1pkx41c.png" alt="By MidJourney AI" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Nx Specific Approach
&lt;/h2&gt;

&lt;p&gt;Now let’s compare Nx monorepo approach vs Nx non-monorepo approach with example of Angular app.&lt;/p&gt;

&lt;p&gt;With Nx — &lt;strong&gt;In both cases you have to create your features as libraries&lt;/strong&gt;. Don’t get discouraged by this step. Having things as &lt;strong&gt;libs allow Nx to do it’s magic&lt;/strong&gt; and for you it’s almost the same as simple directories. &lt;/p&gt;

&lt;p&gt;Our application will have two libraries, Tasks for task-related functionalities, and Users for user-related functionalities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcnzm4e76hjfo0y40ksxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcnzm4e76hjfo0y40ksxn.png" alt="By MidJourney AI" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Nx Monorepo Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Monorepo Approach
&lt;/h3&gt;

&lt;p&gt;Monorepo approach is basically putting all closely related projects into one big box — a single repository.&lt;/p&gt;

&lt;p&gt;Sounds scary, isn’t it? That’s why a lot of people immediately disregard Nx — because they think its for monorepo only. It’s not. But I will explain that later — for now let’s focus on monorepo. &lt;/p&gt;

&lt;h3&gt;
  
  
  Key Steps and Differences:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Creating the workspace&lt;/strong&gt;: An Nx workspace is created with &lt;code&gt;npx create-nx-workspace@latest  — preset=angular-monorepo&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Creating the application:&lt;/strong&gt; We generate an Angular application inside the workspace using &lt;code&gt;npx nx generate @nrwl/angular:app task-manager&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generating libraries:&lt;/strong&gt; &lt;code&gt;npx nx g @nx/angular:library tasks, npx nx g @nx/angular:library users&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dependency management:&lt;/strong&gt; In a monorepo, all apps and libraries share the same node_modules, simplifying dependency management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Building the application:&lt;/strong&gt; The command &lt;code&gt;npx nx build task-manager&lt;/code&gt; builds the application. Due to Nx's advanced computation caching, build times can be significantly reduced in a monorepo setup. It’s only going to build the part of app that you made changes for.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    task-management/
    ├── apps/
    │   ├── task-manager/
    │   │   ├── src/
    │   │   │   ├── app/
    │   │   │   ├── main.ts
    │   │   │   ├── index.html
    │   │   │   ├── ...
    │   │   ├── angular.json
    │   │   ├── ...
    │   ├── task-manager-e2e/
    │   │   ├── ...
    ├── libs/
    │   ├── tasks/
    │   │   ├── src/
    │   │   │   ├── lib/
    │   │   │   ├── index.ts
    │   │   │   ├── ...
    │   │   ├── ...
    │   ├── users/
    │   │   ├── src/
    │   │   │   ├── lib/
    │   │   │   ├── index.ts
    │   │   │   ├── ...
    │   │   ├── ...
    ├── node_modules/
    ├── package.json
    ├── nx.json
    ├── project.json
    ├── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, all applications are stored under the &lt;code&gt;apps/&lt;/code&gt; directory, while libraries are stored under the &lt;code&gt;libs/&lt;/code&gt; directory. They share the same &lt;code&gt;node_modules/&lt;/code&gt; directory, which houses dependencies for the entire workspace.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Sharing&lt;/strong&gt;: Monorepo allows seamless code sharing across different applications and libraries. This can significantly reduce code duplication in projects with multiple apps sharing common functionality. It’s all there in one repository which makes your IDE aware of literally everything. No more NPM packages to worry about.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Atomic Changes&lt;/strong&gt;: Changes across multiple projects can be committed all at once (it’s just a “git branch”), making it easier to track. Nx is smart enough to only build/test what has been affected by your change. So for example only 2 out of 20 apps &amp;amp; 5 out of 100 libs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unified Build &amp;amp; Test Setup&lt;/strong&gt;: With all projects in the same place, you can build, test, and release them all together. Setting up and keeping integration tests running smoothly is easier when all projects are under the same roof.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simplified Dependency Management&lt;/strong&gt;: All your projects share the same dependencies. In theory there is a way to have multiple different versions — however Nx team strictly encourages single-version policy. So, there’s only one package.json file you need to worry about. It also enforces keeping everything in sync. You have to do more work across all of the apps to make sure everything is working fine after updates  — which in the end is good for the project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Consistency&lt;/strong&gt;: It’s simpler to make sure everyone is playing by the same rules when all your projects are in one place. You can designate ownership of certain apps/parts to teams/people in your organization. You enable easy way to onboard new developers — they can utilize code generators and you make sure the structure is always as expected.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Streamlined Onboarding&lt;/strong&gt;: It’s easier for new developers to get started when everything’s located in one place.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Monorepo isn’t perfect either. Here are a few things to watch out for:&lt;/p&gt;

&lt;h3&gt;
  
  
  Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: As your codebase expands, the time it takes to build and test might also grow. That said, Nx does a solid job in tackling this with its &lt;a href="https://nx.dev/core-features/cache-task-results" rel="noopener noreferrer"&gt;computation caching&lt;/a&gt; and &lt;a href="https://nx.dev/core-features/run-tasks#run-tasks-affected-by-a-pr" rel="noopener noreferrer"&gt;affected commands&lt;/a&gt;. However — large codebases can still lead to slower IDE performance and longer test, build, and CI times.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Increased Complexity&lt;/strong&gt;: A monorepo can get complex, especially with large codebases and teams. You need to be very strict and have the rules set right to keep order easily.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Merge Conflicts&lt;/strong&gt;: With multiple teams working on different applications in the same repository, the potential for merge conflicts increases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read Access Control&lt;/strong&gt;: In the world of Monorepo, everyone typically gets read access to everything. There is no easy way to restrict read access to specific projects. This might not be the best fit if you need more control over who gets to touch what.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Reviews&lt;/strong&gt;: With potentially larger scopes of changes, code reviews might feel overwhelming. You can potentially solve this issue assigning the “codeowners” to certain parts.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fres2nb7hce2negv7gx8y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fres2nb7hce2negv7gx8y.png" alt="By MidJourney AI" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Nx Non-monorepo Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Polyrepo Approach
&lt;/h3&gt;

&lt;p&gt;Let’s talk about the Polyrepo Approach. Here, each project gets its own personal space — its own separate repository. If you’re a big organization, you might have to juggle between 10–20 separate repositories.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Steps and Differences:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Creating the workspace&lt;/strong&gt;: When creating an Nx workspace for a standalone setup, we use &lt;code&gt;npx create-nx-workspace@latest&lt;/code&gt;, select &lt;code&gt;Standalone Application&lt;/code&gt;, and name the application &lt;code&gt;task-manager&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generating libraries:&lt;/strong&gt; &lt;code&gt;npx nx g @nx/angular:library tasks, npx nx g @nx/angular:library users&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Building the application:&lt;/strong&gt; The command &lt;code&gt;npx nx build task-manager&lt;/code&gt; builds the application. The computation caching in Nx also works in a standalone setup but has less impact since there's only one app.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    task-manager/
    ├── src/
    │   ├── app/
    │   ├── main.ts
    │   ├── index.html
    │   ├── ...
    ├── libs/
    │   ├── tasks/
    │   │   ├── src/
    │   │   │   ├── lib/
    │   │   │   ├── index.ts
    │   │   │   ├── ...
    │   │   ├── ...
    │   ├── users/
    │   │   ├── src/
    │   │   │   ├── lib/
    │   │   │   ├── index.ts
    │   │   │   ├── ...
    │   │   ├── ...
    ├── node_modules/
    ├── project.json
    ├── nx.json
    ├── package.json
    ├── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the structure is simpler. The application and its source files are at the root of the project. Libraries are still present in a &lt;code&gt;libs/&lt;/code&gt; directory — but you can name that directory however you like. You can also have multiple libs directories. &lt;/p&gt;

&lt;h3&gt;
  
  
  With non-monorepo appraoch you still get all of that out of the box:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ready to go Angular application at the root of the Nx workspace (&lt;code&gt;src/app&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Cypress based e2e test (&lt;code&gt;e2e/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Prettier preconfigured&lt;/li&gt;
&lt;li&gt;ESLint preconfigured&lt;/li&gt;
&lt;li&gt;Jest preconfigured&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simplified Project Structure&lt;/strong&gt;: Standalone setup has a simpler project structure, making it easier for smaller teams or for those just starting with Nx. One repository equals one project, making it easier to understand and find your way around the codebase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Isolation&lt;/strong&gt;: Standalone setup keeps applications isolated from each other. It’s beneficial when the apps don’t have much in common or when strict isolation between them is required. Each repository is its own island, encouraging you to write code that stands alone, which can lead to higher quality code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Specific Configurations&lt;/strong&gt;: Standalone applications can have their own specific configurations, providing flexibility when different apps have differing requirements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Controlled Read Access&lt;/strong&gt;: You get to decide who gets in and who doesn’t. This means you can limit read access to certain apps or parts of your codebase, making Polyrepos a good choice if different teams or people need different levels of read access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manageable Code Reviews&lt;/strong&gt;: Code reviews are less of a headache, as changes are usually tucked away in specific repositories.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But, polyrepos are not perfect. There can be some bumps along the way.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Duplication&lt;/strong&gt;: Sharing code between projects can turn into a copy-paste festival if you’re not careful. Or you can end up maintaining 10 NPM packages across your apps and struggle with keeping everything up to date with latest versions. Standalone setups do not facilitate code sharing as efficiently as monorepos, making them less suitable for projects with multiple apps that share significant functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multiple Build Configurations&lt;/strong&gt;: If you have multiple standalone applications, each may require a separate build configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dependency Management&lt;/strong&gt;: This can get a bit tricky. Each project has its own package.json file, and you might end up with different versions of third-party dependencies across projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Coordinating Changes&lt;/strong&gt;: Making changes that affect several projects at once can be overwhelming. A single feature or bug fix could need changes in a few different repositories.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tricky Integration Tests&lt;/strong&gt;: Setting up and keeping integration tests running smoothly across different repositories can be more of a hassle compared to a monorepo setup.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Futqwvazr2jc34u9sw04s.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Futqwvazr2jc34u9sw04s.jpeg" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Go with Nx
&lt;/h2&gt;

&lt;p&gt;Choosing between a monorepo and a non-monorepo (polyrepo) setup really comes down to what your project needs. If you’ve got a big project with a lot of shared stuff, &lt;strong&gt;a monorepo could be a good fit&lt;/strong&gt;. But if your project is smaller or needs to keep things separate, have better control of read access restrictions, then a &lt;strong&gt;standalone setup might be the way to go&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Both have their pros and cons — but as mentioned before. Doesn’t matter which one you pick. &lt;strong&gt;Nx has something in store for you for both options.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I cannot see any reason not to start Angular project without Nx as companion. For monorepo or polyrepo approach.&lt;/p&gt;




&lt;h3&gt;
  
  
  I hope you liked my article!
&lt;/h3&gt;

&lt;p&gt;If you did you might also like what I am doing on &lt;strong&gt;Twitter&lt;/strong&gt;. I am hosting live Twitter Spaces about Angular with GDEs &amp;amp; industry experts! You can participate live, ask your questions or watch replays in a form of short clips :)&lt;/p&gt;

&lt;p&gt;If you are interested drop me a follow on &lt;strong&gt;Twitter &lt;a href="https://twitter.com/DanielGlejzner" rel="noopener noreferrer"&gt;@DanielGlejzner&lt;/a&gt; — would mean a lot :). Thank You!&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Angular Job Interview: How Important are Technical Details When Hiring a Developer?</title>
      <dc:creator>Daniel Glejzner</dc:creator>
      <pubDate>Fri, 19 May 2023 15:19:29 +0000</pubDate>
      <link>https://dev.to/playfulprogramming-angular/angular-job-interview-how-important-are-technical-details-when-hiring-a-developer-3hpd</link>
      <guid>https://dev.to/playfulprogramming-angular/angular-job-interview-how-important-are-technical-details-when-hiring-a-developer-3hpd</guid>
      <description>&lt;h2&gt;
  
  
  Twitter Spaces vs Podcasts?
&lt;/h2&gt;

&lt;p&gt;⚡ Spaces empower the whole Angular community to interact&lt;br&gt;
My goal is to bring experts to you!&lt;/p&gt;

&lt;p&gt;Florin Mateescu used this to ask Brecht Billiet and GDE Chau N Tran about importance of:&lt;/p&gt;

&lt;p&gt;⚛️ Algorithms &amp;amp; data structures&lt;br&gt;
🗣️ Soft skills&lt;br&gt;
🐲 Years of experience&lt;/p&gt;

&lt;p&gt;Full audio in comments&lt;/p&gt;

</description>
      <category>angular</category>
      <category>interview</category>
      <category>webdev</category>
      <category>job</category>
    </item>
    <item>
      <title>Deactivate Angular NgZone selectively — the easy way</title>
      <dc:creator>Daniel Glejzner</dc:creator>
      <pubDate>Wed, 17 May 2023 10:12:16 +0000</pubDate>
      <link>https://dev.to/playfulprogramming-angular/deactivate-angular-ngzone-selectively-the-easy-way-54b5</link>
      <guid>https://dev.to/playfulprogramming-angular/deactivate-angular-ngzone-selectively-the-easy-way-54b5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F292o06h035q0z56np34f.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F292o06h035q0z56np34f.jpeg" alt="Generated by MidJourney AI" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A fine-grained control over Angular's change detection mechanism is here and ready to be used!&lt;/p&gt;

&lt;p&gt;Signals and change detection optimization is not quite there yet. But even today there are ways to help you manage change detection easily.&lt;/p&gt;

&lt;p&gt;The reactive extensions for Angular, &lt;a href="https://www.rx-angular.io/" rel="noopener noreferrer"&gt;RxAngular&lt;/a&gt;, provide us with powerful tools to control and optimize our application performance. One of these tools is the unpatch directive.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6j6tc0dsqsr5rlolkvrv.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6j6tc0dsqsr5rlolkvrv.jpeg" alt="Generated by MidJourney AI" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Unpatch Directive?
&lt;/h2&gt;

&lt;p&gt;In Angular, the NgZone service manages the execution of tasks inside or outside Angular’s change detection mechanism. Veteran Angular developers describe this as two zones. By default, &lt;strong&gt;Angular runs almost everything inside an Angular Zone&lt;/strong&gt;, meaning any asynchronous operations like setTimeout, Promise, or any DOM events will trigger Angular's change detection.&lt;/p&gt;

&lt;p&gt;While this default mechanism ensures that the UI is consistently updated with the latest changes, &lt;strong&gt;it can lead to performance issues when handling high-frequency events&lt;/strong&gt;, such as mousemove or scroll. These events can trigger a large number of unnecessary change detection cycles.&lt;/p&gt;

&lt;p&gt;This is where the unpatch directive steps in. By using unpatch, we can prevent certain events from triggering change detection — improving performance. &lt;strong&gt;The directive can be used on any element to which you apply event bindings.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;unpatch&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"triggerSomeMethod($event)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;click me&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The unpatch directive prevents the 'click' event from triggering Angular's change detection. By default unpatch all registered listeners of the host it is applied on. If you want you to specify exactly what to unpatch - you can provide a list as shown in examples below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33f6xfec6yrty98lrlhq.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33f6xfec6yrty98lrlhq.jpeg" alt="Generated by MidJourney AI" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to utilize &lt;code&gt;unpatch&lt;/code&gt; in your app
&lt;/h2&gt;

&lt;p&gt;Let’s dive into a real-world scenario where unpatch can significantly boost performance. Imagine we're building a real-time data visualization tool, handling a large number of DOM elements and several high-frequency events like mousemove, scroll, etc.&lt;/p&gt;

&lt;p&gt;Initially, we have a component rendering a large dataset in a tabular format. Each row of the table has a hover effect showing additional data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*ngFor=&lt;/span&gt;&lt;span class="s"&gt;"let data of largeDataSet"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;(mousemove)=&lt;/span&gt;&lt;span class="s"&gt;"showAdditionalData(data)"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"data-row"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- Basic data display --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this scenario, the mousemove event fires very frequently, triggering change detection for the entire component tree. Even if the additional data doesn’t change, Angular still rerenders the component tree, leading to performance issues.&lt;/p&gt;

&lt;p&gt;Now, let’s optimize this with the unpatch directive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*ngFor=&lt;/span&gt;&lt;span class="s"&gt;"let data of largeDataSet"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;[unpatch]=&lt;/span&gt;&lt;span class="s"&gt;"['mousemove']"&lt;/span&gt; &lt;span class="na"&gt;(mousemove)=&lt;/span&gt;&lt;span class="s"&gt;"showAdditionalData(data)"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"data-row"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- Basic data display --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By using unpatch, we're instructing Angular not to run change detection every time the 'mousemove' event fires.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flc0r6yg0xfqnrb0pcalm.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flc0r6yg0xfqnrb0pcalm.jpeg" alt="Generated by MidJourney AI" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Kanban Board
&lt;/h2&gt;

&lt;p&gt;Imagine a Kanban board application where users can drag and drop tasks between different columns.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"task"&lt;/span&gt; 
         &lt;span class="na"&gt;(dragstart)=&lt;/span&gt;&lt;span class="s"&gt;"dragStart($event, task)"&lt;/span&gt; 
         &lt;span class="na"&gt;(dragover)=&lt;/span&gt;&lt;span class="s"&gt;"dragOver($event)"&lt;/span&gt; 
         &lt;span class="na"&gt;(drop)=&lt;/span&gt;&lt;span class="s"&gt;"drop($event, column)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="c"&gt;&amp;lt;!-- Task display --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the dragstart, dragover, and drop events are firing when a user drags a task and drops it onto another column. Each of these events triggers Angular’s change detection, which can lead to performance issues, especially with a large number of tasks.&lt;/p&gt;

&lt;p&gt;Now, let’s optimize this with the unpatch directive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"task"&lt;/span&gt; 
         &lt;span class="na"&gt;[unpatch]=&lt;/span&gt;&lt;span class="s"&gt;"['dragstart', 'dragover', 'drop']"&lt;/span&gt; 
         &lt;span class="na"&gt;(dragstart)=&lt;/span&gt;&lt;span class="s"&gt;"dragStart($event, task)"&lt;/span&gt; 
         &lt;span class="na"&gt;(dragover)=&lt;/span&gt;&lt;span class="s"&gt;"dragOver($event)"&lt;/span&gt; 
         &lt;span class="na"&gt;(drop)=&lt;/span&gt;&lt;span class="s"&gt;"drop($event, column)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="c"&gt;&amp;lt;!-- Task display --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the unpatch directive, the dragstart, dragover, and drop events will no longer trigger Angular's change detection. As a result, the performance of the application can significantly improve when users are frequently dragging and dropping tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;However, please note that you would need to manually trigger change detection if any of these events cause changes that should be reflected in the UI!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Angular’s ChangeDetectorRef service allows you to manually run change detection on a component and its child components. You can use its detectChanges method to manually trigger change detection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;changeDetector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChangeDetectorRef&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="nf"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DragEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// logic &lt;/span&gt;

      &lt;span class="c1"&gt;// manually trigger change detection&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;changeDetector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detectChanges&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The unpatch directive provided by the RxAngular library is a powerful tool for optimizing Angular applications. By preventing unnecessary change detection cycles, it helps to improve the performance and responsiveness of applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make sure to also check out other goodies that &lt;a href="https://www.rx-angular.io/" rel="noopener noreferrer"&gt;RxAngular&lt;/a&gt; offers.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  I hope you liked my article!
&lt;/h3&gt;

&lt;p&gt;If you did you might also like what I am doing on &lt;strong&gt;Twitter&lt;/strong&gt;. I am hosting live Twitter Spaces about Angular with GDEs &amp;amp; industry experts! You can participate live, ask your questions or watch replays in a form of short clips :)&lt;/p&gt;

&lt;p&gt;If you are interested drop me a follow on &lt;strong&gt;Twitter &lt;a href="https://twitter.com/DanielGlejzner" rel="noopener noreferrer"&gt;@DanielGlejzner&lt;/a&gt; — would mean a lot :). Thank You!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>rxjs</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Angular 16 is out now: Learn how to Replace RxJS with Signals</title>
      <dc:creator>Daniel Glejzner</dc:creator>
      <pubDate>Sat, 06 May 2023 06:41:50 +0000</pubDate>
      <link>https://dev.to/playfulprogramming-angular/angular-16-is-out-now-learn-how-to-replace-rxjs-with-signals-4enl</link>
      <guid>https://dev.to/playfulprogramming-angular/angular-16-is-out-now-learn-how-to-replace-rxjs-with-signals-4enl</guid>
      <description>&lt;h2&gt;
  
  
  Angular 16 is out now: Learn how to Replace RxJS with Signals
&lt;/h2&gt;

&lt;p&gt;Here I have one specific real world example for you, raw code comparison. Nothing more, nothing less!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4etj97pl0qamae8v0xws.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4etj97pl0qamae8v0xws.jpeg" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  But but but… Signals &amp;amp; RxJS right — it’s not supposed to replace it?
&lt;/h2&gt;

&lt;p&gt;Couldn’t help myself and spark a little controversy in the title. Example I have is completely replacing RxJS implementation with Signals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signals are meant to replace RxJS to simplify your reactive code. However, only synchronous RxJS code&lt;/strong&gt; — I wouldn’t replace asynchronous parts :).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8hvsp6h850h2k0akjchm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8hvsp6h850h2k0akjchm.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Search &amp;amp; Pagination (RxJS)
&lt;/h2&gt;

&lt;p&gt;Here is RxJS code of small feature that allows you to search for a user and use pagination. It’s meant to showcase how synchronous &lt;strong&gt;RxJS code can be simplified with Signals.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I asked for code review for this parts. While I have been talking with my friends — &lt;strong&gt;each one of them found different things to improve in my initial code and had different vision on how this could look like.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Additionally there have been occasional bugs and potential memory leaks. &lt;strong&gt;This is exactly why working with synchronous RxJS is not ideal.&lt;/strong&gt; I also bet that looking at this example you also have a different kind of implementation in mind!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Spiderman&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hulk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Wolverine&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cyclops&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Venom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;FormsModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
      &amp;lt;input [ngModel]="searchInput$ | async" (ngModelChange)="searchUser($event)" placeholder="Search"&amp;gt;

      &amp;lt;ul&amp;gt;
        &amp;lt;li *ngFor="let user of paginatedAndFilteredUsers$ | async"&amp;gt;{{ user.name }}&amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;

      &amp;lt;button (click)="goToPrevPage()"&amp;gt;Previous&amp;lt;/button&amp;gt;
      pag. {{ currentPage$ | async }}
      &amp;lt;button (click)="goToNextPage()"&amp;gt;Next&amp;lt;/button&amp;gt;
    `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;firstPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nx"&gt;itemsPerPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nx"&gt;searchInput$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BehaviorSubject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;currentPage$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BehaviorSubject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;paginatedAndFilteredUsers$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;combineLatest&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;distinctUntilChanged&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="c1"&gt;// trigger only when it actually changes&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchInput$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nf"&gt;distinctUntilChanged&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
          &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
              &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;filteredUsers&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;startIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemsPerPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;endIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;startIndex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemsPerPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;filteredUsers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;endIndex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nf"&gt;searchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchInput$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nf"&gt;goToPrevPage&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nf"&gt;goToNextPage&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemsPerPage&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3bmw18w7586gene1sx8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3bmw18w7586gene1sx8.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Search &amp;amp; Pagination (Signals)
&lt;/h2&gt;

&lt;p&gt;Exactly the same implementation but done with Signals&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Spiderman&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hulk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Wolverine&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cyclops&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Venom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;FormsModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
      &amp;lt;input [ngModel]="searchInput()" (ngModelChange)="searchUser($event)" placeholder="Search"&amp;gt;

      &amp;lt;ul&amp;gt;
        &amp;lt;li *ngFor="let user of paginatedAndFilteredUsers()"&amp;gt;{{ user.name }}&amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;

      &amp;lt;button (click)="goToPrevPage()"&amp;gt;Previous&amp;lt;/button&amp;gt;
      pag. {{ currentPage() }}
      &amp;lt;button (click)="goToNextPage()"&amp;gt;Next&amp;lt;/button&amp;gt;
    `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;firstPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nx"&gt;itemsPerPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nx"&gt;searchInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;currentPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;paginatedAndFilteredUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;startIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemsPerPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;endIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;startIndex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemsPerPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;searchInput&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
          &lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;endIndex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="nf"&gt;searchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nf"&gt;goToPrevPage&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nf"&gt;goToNextPage&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
          &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemsPerPage&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnyb8fsk9l29zulucb0xc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnyb8fsk9l29zulucb0xc.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Now comparison one by one
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;//RxJs&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;FormsModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
      &amp;lt;input [ngModel]="searchInput$ | async" (ngModelChange)="searchUser($event)" placeholder="Search"&amp;gt;

      &amp;lt;ul&amp;gt;
        &amp;lt;li *ngFor="let user of paginatedAndFilteredUsers$ | async"&amp;gt;{{ user.name }}&amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;

      &amp;lt;button (click)="goToPrevPage()"&amp;gt;Previous&amp;lt;/button&amp;gt;
      pag. {{ currentPage$ | async }}
      &amp;lt;button (click)="goToNextPage()"&amp;gt;Next&amp;lt;/button&amp;gt;
    `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="c1"&gt;// Signals&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;FormsModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
      &amp;lt;input [ngModel]="searchInput()" (ngModelChange)="searchUser($event)" placeholder="Search"&amp;gt;

      &amp;lt;ul&amp;gt;
        &amp;lt;li *ngFor="let user of paginatedAndFilteredUsers()"&amp;gt;{{ user.name }}&amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;

      &amp;lt;button (click)="goToPrevPage()"&amp;gt;Previous&amp;lt;/button&amp;gt;
      pag. {{ currentPage() }}
      &amp;lt;button (click)="goToNextPage()"&amp;gt;Next&amp;lt;/button&amp;gt;
    `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;//RxJS&lt;/span&gt;
    &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;firstPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nx"&gt;itemsPerPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nx"&gt;searchInput$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BehaviorSubject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;currentPage$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BehaviorSubject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;paginatedAndFilteredUsers$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;combineLatest&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;distinctUntilChanged&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchInput$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nf"&gt;distinctUntilChanged&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
          &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
              &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;filteredUsers&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;startIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemsPerPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;endIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;startIndex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemsPerPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;filteredUsers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;endIndex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;//Signals&lt;/span&gt;
    &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;firstPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nx"&gt;itemsPerPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nx"&gt;searchInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;currentPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;paginatedAndFilteredUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;startIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemsPerPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;endIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;startIndex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemsPerPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;searchInput&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
          &lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;endIndex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;//RxJS&lt;/span&gt;
    &lt;span class="nf"&gt;searchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchInput$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;//Signals&lt;/span&gt;
    &lt;span class="nf"&gt;searchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;//RxJS&lt;/span&gt;
    &lt;span class="nf"&gt;goToPrevPage&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;goToNextPage&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemsPerPage&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;//Signals&lt;/span&gt;
    &lt;span class="nf"&gt;goToPrevPage&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;goToNextPage&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
          &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentPage&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemsPerPage&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Please remember that currently Signals are in developer preview only! However they are here to stay — and I have to say I love how they replace and simplify code initially written with synchronous RxJS in mind.&lt;/p&gt;

&lt;h3&gt;
  
  
  Disclaimer
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;If you are reading this in 2024 it means — I haven’t updated this content. You should find me and tell me how bad I behaved. Example here is based on initial developer preview of Signals available in Angular 16 on it’s release date.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is going to change once full vision of Signals is available. If you tracked RFCs and proposals — you might immediately think that example presented would work differently with input based signals that are still not available to use.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  I hope you liked my article!
&lt;/h3&gt;

&lt;p&gt;If you did you might also like what I am doing on &lt;strong&gt;Twitter&lt;/strong&gt;. I am hosting live Twitter Spaces about Angular with GDEs &amp;amp; industry experts! You can participate live, ask your questions or watch replays in a form of short clips :)&lt;/p&gt;

&lt;p&gt;If you are interested drop me a follow on &lt;strong&gt;Twitter &lt;a href="https://twitter.com/DanielGlejzner" rel="noopener noreferrer"&gt;@DanielGlejzner&lt;/a&gt; — would mean a lot :). Thank You!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>signals</category>
      <category>rxjs</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Join the Angular v16/17 Development: — Discover How to Collaborate with the Angular Team!</title>
      <dc:creator>Daniel Glejzner</dc:creator>
      <pubDate>Wed, 03 May 2023 06:00:00 +0000</pubDate>
      <link>https://dev.to/playfulprogramming-angular/join-the-angular-v1617-development-discover-how-to-collaborate-with-the-angular-team-4nm7</link>
      <guid>https://dev.to/playfulprogramming-angular/join-the-angular-v1617-development-discover-how-to-collaborate-with-the-angular-team-4nm7</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4n58jopvqqmiwiwqdll.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4n58jopvqqmiwiwqdll.jpeg" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The official Signals RFC has ended. &lt;strong&gt;But do you know what RFC is?&lt;/strong&gt; Many people don’t!&lt;/p&gt;

&lt;p&gt;I recently got involved in the process of releasing a new version of Angular. &lt;strong&gt;In the past, I didn’t get involved&lt;/strong&gt; because I didn’t know much about it. I didn’t follow the process and barely talked with the community. I was missing out!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3k8eu99d3u5b0ra58bhg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3k8eu99d3u5b0ra58bhg.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Signals RFC officially closed
&lt;/h2&gt;

&lt;p&gt;RFC means “Request for Comments”. The Angular Team wants to hear your opinion on the changes they propose. &lt;strong&gt;The Signals RFC got a lot of attention with over 1000 comments.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But compared to the millions of Angular developers around the world, this isn’t much. Many of them don’t take part in shaping Angular’s future or talking with the great community. Which is a shame.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Angular Team really listens to what people say.&lt;/strong&gt; They’ve made changes based on feedback, and they’re planning to make more.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fromSignal&lt;/code&gt; and &lt;code&gt;fromObservable&lt;/code&gt; renamed to &lt;code&gt;toObservable&lt;/code&gt; and &lt;code&gt;toSignal&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcoij3glxg2b332gmfai4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcoij3glxg2b332gmfai4.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Voice your concerns and be heard!
&lt;/h2&gt;

&lt;p&gt;Sure, everyone likes a pat on the back, but what the Angular Team values most is &lt;strong&gt;constructive criticism.&lt;/strong&gt; It might be tough to hear, but it’s the best way for them to improve. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Looking at the RFC section can be tough&lt;/strong&gt; with so many comments and discussions. The technical details are hard enough to understand, let alone keeping up with all the comments.&lt;/p&gt;

&lt;p&gt;To help the community understand what’s going on, &lt;strong&gt;I started writing articles about recent Sub-RFCs.&lt;/strong&gt; My goal was to explain things simply but still provide enough information to get people thinking and talking.&lt;br&gt;
&lt;a href="https://dev.to/this-is-angular/sub-rfc-4-for-angular-signals-sparks-interesting-discussion-started-by-rxjs-author-ben-lesh-9a2"&gt;&lt;strong&gt;Sub-RFC 4 for Angular Signals sparks interesting discussion started by RxJS author — Ben Lesh&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/this-is-angular/signals-sub-rfc-3-new-angular-reactive-approach-or-a-path-to-confusion-1kkm"&gt;&lt;strong&gt;Signals Sub-RFC 3 —  New Angular Reactive Approach or a Path to Confusion?&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/this-is-angular/minko-gechev-on-angular-16-17-game-changer-or-loss-of-identity--5lk"&gt;&lt;strong&gt;Minko Gechev on Angular 16 &amp;amp; 17 — game changer or loss of identity ?&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkz7n6ar8oy5fwafv0vn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkz7n6ar8oy5fwafv0vn.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The big summary of concerns
&lt;/h2&gt;

&lt;p&gt;My articles seem to be helping people stay up to date — learn that they can play an active role and &lt;strong&gt;talk directly with the Angular Core Team!&lt;/strong&gt; All it takes is to drop your thoughts in RFC which is located in Discussions section of &lt;a href="https://github.com/angular/angular/discussions" rel="noopener noreferrer"&gt;Angular repo&lt;/a&gt; (GitHub).&lt;/p&gt;

&lt;p&gt;However, I noticed that many people were still worried about the changes suggested in the RFC. So, &lt;strong&gt;I decided to write a summary of all the concerns&lt;/strong&gt; raised in the comments under the Signals RFC/Sub-RFCs and post it before the deadline.&lt;/p&gt;

&lt;p&gt;I have done so without dwelling on technical details as these can change many times. &lt;/p&gt;

&lt;h3&gt;
  
  
  The main goals were:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;to make sure the Angular Team could easily find this summary for future planning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to help community members understand the possible downsides of the upcoming changes - filtered out of the communication noise in Discussions section under RFC. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;With the help of some community members&lt;/strong&gt;, I managed to do it. You can check it out here: &lt;a href="https://github.com/angular/angular/discussions/49685#discussioncomment-5697665" rel="noopener noreferrer"&gt;https://github.com/angular/angular/discussions/49685#discussioncomment-5697665&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7i9pnc9ubdc0rb478kr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7i9pnc9ubdc0rb478kr.png" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular Signals RFC — Closing Summary
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/alxhub" rel="noopener noreferrer"&gt;Alex Rickabaugh&lt;/a&gt; from the Angular Core Team posted a summary. &lt;strong&gt;The Angular Team was happy with the active participation&lt;/strong&gt; and acknowledged some of the concerns raised by community members. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Having this in mind — I also hosted a Twitter Spaces session with Angular experts to discuss the summary.&lt;/strong&gt; To our surprise, some members of the Angular Core Team joined us and answered our questions!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknfozarqoqb28zxjy69l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknfozarqoqb28zxjy69l.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular 16 and Beyond: Bringing The Community Along!
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/isGF3S41RtU?start=0"&gt;
&lt;/iframe&gt;
&lt;br&gt;
First —  &lt;strong&gt;Angular Mark Thompson&lt;/strong&gt; joined and listened to us talking for some time before appearing on the stage. He ensured us that latest changes are not going to leave anybody behind. &lt;/p&gt;

&lt;h2&gt;
  
  
  Staying Responsible in Angular: Evolving for the Future
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/3gHzOiJJRVw?start=0"&gt;
&lt;/iframe&gt;
&lt;br&gt;
After Mark, &lt;strong&gt;Alex Rickabaugh joined the conversation&lt;/strong&gt; to explain more and further assure us that a lot of things have not been decided yet. Angular Team is treating the responsibility for evolving Angular as priority. Final outcome will be influenced by the community.&lt;br&gt;
&lt;strong&gt;I recommend replaying the whole space&lt;/strong&gt; — a lot of valuable info and discussions! &lt;a href="https://twitter.com/i/spaces/1lPKqBkRwbbGb?s=20" rel="noopener noreferrer"&gt;https://twitter.com/i/spaces/1lPKqBkRwbbGb?s=20&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkj6960mtifqsx5yfeobk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkj6960mtifqsx5yfeobk.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Results of actions taken
&lt;/h2&gt;

&lt;p&gt;The actions I took brought the community closer together, helped people understand the RFCs, and gave us a chance to talk directly with the Angular Team. &lt;strong&gt;This helped calm down many concerned community members and got them excited about the future of Angular.&lt;/strong&gt; Now they’re planning to get involved in future RFCs to help shape Angular’s future. &lt;/p&gt;

&lt;h3&gt;
  
  
  What you can do to help along the way?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fserdblt5y5039leb0wwe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fserdblt5y5039leb0wwe.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pre-RFC Phase&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This is where the Angular Team and the community talk about possible new features and improvements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actions you can take&lt;/strong&gt;: Your ideas and feedback are important here.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;RFCs Phase&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The Angular Team writes formal RFCs to suggest new features or changes. These documents are published on the &lt;a href="https://github.com/angular/angular/discussions" rel="noopener noreferrer"&gt;**Angular GitHub repository&lt;/a&gt;** for review and feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your Role&lt;/strong&gt;: This is your chance to give your thoughts on the proposed changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Sub-RFCs and Discussions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Based on the feedback, the Angular Team might create more Sub-RFCs to adjust the proposed changes or expand on them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actions to take&lt;/strong&gt;: This involves more discussions and changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Final Design and Implementation:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;After the RFCs and Sub-RFCs are final, the Angular Team starts making the changes a reality. This includes writing code, testing, and updating documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you can do:&lt;/strong&gt; You can help by joining in on the implementation process, raising pull requests, reporting issues, and helping with documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Beta and Release Candidate (RC) Versions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Beta and RC versions of new Angular are released to let developers test new features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guess what?&lt;/strong&gt;: Your job here is to test, test, and test some more!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Final Release&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;After sorting out the issues found during the Beta and RC phases — Angular Team releases the final new version. But your job doesn’t end here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contribute:&lt;/strong&gt; Even after the final version is out, there’s always more to do — keep an eye out for potential issues and continue to contribute.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F91132xn5jwukgkz6owq0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F91132xn5jwukgkz6owq0.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So, are you ready to help shape the future of Angular? Let’s do it together!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Upcoming RFCs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Testing with Signals&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Control Flow&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  I hope you liked my article!
&lt;/h3&gt;

&lt;p&gt;If you did you might also like what I am doing on &lt;strong&gt;Twitter&lt;/strong&gt;. I am hosting live Twitter Spaces about Angular with GDEs &amp;amp; industry experts! You can participate live, ask your questions or watch replays in a form of short clips :)&lt;/p&gt;

&lt;p&gt;If you are interested drop me a follow on &lt;strong&gt;Twitter &lt;a href="https://twitter.com/DanielGlejzner" rel="noopener noreferrer"&gt;@DanielGlejzner&lt;/a&gt; — would mean a lot :). Thank You!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>frontend</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Minko Gechev on Angular 16 &amp; 17 — game changer or loss of identity ?</title>
      <dc:creator>Daniel Glejzner</dc:creator>
      <pubDate>Tue, 18 Apr 2023 08:32:42 +0000</pubDate>
      <link>https://dev.to/playfulprogramming-angular/minko-gechev-on-angular-16-17-game-changer-or-loss-of-identity--5lk</link>
      <guid>https://dev.to/playfulprogramming-angular/minko-gechev-on-angular-16-17-game-changer-or-loss-of-identity--5lk</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbh6dppyoq9n6gtfare0.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbh6dppyoq9n6gtfare0.jpeg" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In a recent &lt;a href="https://www.youtube.com/watch?v=aXfCNbU-9EY&amp;amp;t=3s" rel="noopener noreferrer"&gt;podcast&lt;/a&gt;, &lt;strong&gt;Minko Gechev — Lead and manager for Angular developer relations&lt;/strong&gt; - shared valuable insights into the future of Angular and its planned developments. &lt;strong&gt;Let’s go over key takeaways from that interview, focusing on the framework’s future direction.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnc4vv7ezms2zl8js7w9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnc4vv7ezms2zl8js7w9.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hydration API
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Angular Lead&lt;/strong&gt; mentioned the new hydration feature that Angular is introducing, which helps in server-side rendering and improves performance. &lt;strong&gt;Angular is now focusing on partial hydration, which will result in faster rendering times for applications.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal is to have better SSR support and more seamless transitions between server-rendered and client-rendered content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqt41dtsspu93bqen64r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqt41dtsspu93bqen64r.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing DestroyRef
&lt;/h2&gt;

&lt;p&gt;One of the most notable enhancements discussed by &lt;strong&gt;Minko&lt;/strong&gt; is the introduction of &lt;strong&gt;DestroyRef.&lt;/strong&gt; &lt;strong&gt;This feature enables developers to invoke the ngOnDestroy hook more flexibly and integrate it with various parts of the component’s lifecycle.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ExampleComponent {
  constructor() {
    inject(DestroyRef).onDestroy(() =&amp;gt; {
      // do something when the component is destroyed
    })
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This was previously impossible, as developers had to place the ngOnDestroy code directly in the method itself. &lt;strong&gt;DestroyRef will improve integration with libraries like RxJS&lt;/strong&gt;, making Angular development more efficient.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr2vovu91zcida3j5tbj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr2vovu91zcida3j5tbj.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular Material Libraries and Design Tokens
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Minko&lt;/strong&gt; highlighted the impact of design tokens on Angular app development, particularly within Material 3. &lt;strong&gt;Design tokens provide developers with greater flexibility for customizing existing Material components.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Material team at Google will ensure that these tokens remain stable, allowing developers to create finely-tuned components without worrying about frequent changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcirdmsh1277v6h3qta2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcirdmsh1277v6h3qta2l.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Flattening the Angular Learning Path
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Simplifying the Angular learning path is a priority for the Angular Team.&lt;/strong&gt; &lt;strong&gt;Minko&lt;/strong&gt; outlined several incremental improvements aimed at making it easier for developers to learn and work with Angular.&lt;/p&gt;

&lt;p&gt;He says that &lt;strong&gt;RxJS is overwhelming for new developers&lt;/strong&gt; and Angular Team aims to satisfy both sides. If you want to use RxJS go for it, that’s okay. If you don’t want to use it, go with Signals. Mix of both? Feel free.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example of interop:&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const counter: Signal&amp;lt;number&amp;gt; = toSignal(counter$);
const counter: Observable&amp;lt;number&amp;gt; = toObservable(mySignal);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Over time plan is to reduce the RxJS involvement in core parts of the framework.&lt;/strong&gt; Are both new and existing developers going to be happy with the changes? Looking at recent discussions in RFCs — &lt;strong&gt;some veteran developers have major concerns about the approach for the future.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4kro5mnckl9mvc8i527.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4kro5mnckl9mvc8i527.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Standalone Components
&lt;/h2&gt;

&lt;p&gt;The introduction of standalone components is a foundational step towards simplifying Angular. This feature will make learning about NgModule and scoping optional for developers working on standalone apps.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  standalone: true,
  styleUrls: ['./app.component.scss']
})
export class AppComponent {}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;There are also improvements expected for how standalone components are handled today.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8md92fvvut0mhge6y3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8md92fvvut0mhge6y3m.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Simplifying Component Authoring Experience
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Minko&lt;/strong&gt; briefly mentioned that the &lt;strong&gt;Angular Team is considering making component, directives, and pipe decorators optional&lt;/strong&gt;. Aim would be to further simplify the component authoring experience and reduce complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This will result in a simpler, more functional-based approach for creating inputs and outputs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9kzfe9um06xs4fnukjr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9kzfe9um06xs4fnukjr.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular CLI Simplification
&lt;/h2&gt;

&lt;p&gt;The CLI will be updated to have less conceptual overhead, and improvements will be made to the project structure, making it easier for developers to navigate and work with Angular projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fatrvh6abra1yjjafd86f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fatrvh6abra1yjjafd86f.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Improved Documentation and Learning Experience
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Angular Team&lt;/strong&gt; will focus on creating more engaging and digestible tutorials, helping developers learn Angular more efficiently and enjoyably.&lt;/p&gt;

&lt;p&gt;This would be a giant help and improvement over current shape of Angular documentation available today.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbd3buims9tccma3imbv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbd3buims9tccma3imbv.png" alt="Generated by MidJourney AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In summary, the future of Angular looks promising, with a focus on simplification and improved learning experiences for developers. &lt;strong&gt;The introduction of DestroyRef, design tokens, and the flattening of the Angular learning path are just a few of the key developments&lt;/strong&gt; that will shape the framework’s direction moving forward.&lt;/p&gt;

&lt;p&gt;On the other hand it sounds like it brings Angular &lt;strong&gt;more towards functional components and closer to main competitors on the framework market — React &amp;amp; Vue.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a very brief summary — I recommend watching the whole &lt;a href="https://www.youtube.com/watch?v=aXfCNbU-9EY&amp;amp;t=3s" rel="noopener noreferrer"&gt;podcast&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Before I have summarized what is happening around &lt;a href="https://dev.to/this-is-angular/signals-sub-rfc-3-new-angular-reactive-approach-or-a-path-to-confusion-1kkm"&gt;&lt;strong&gt;Sub-RFC3&lt;/strong&gt;&lt;/a&gt; &amp;amp; &lt;a href="https://dev.to/this-is-angular/sub-rfc-4-for-angular-signals-sparks-interesting-discussion-started-by-rxjs-author-ben-lesh-9a2"&gt;&lt;strong&gt;Sub-RFC4&lt;/strong&gt;&lt;/a&gt; — looking at how things are shaping up — are you excited about the future of Angular?&lt;/p&gt;

&lt;p&gt;Or a little bit worried that the framework might lose it’s identity with all of the changes that are coming?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcs94k792rkuhezn3y1c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcs94k792rkuhezn3y1c.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You have a last chance to participate in Signals RFC! — Angular Team is closing it on Monday, April 24! — &lt;a href="https://github.com/angular/angular/discussions/49685" rel="noopener noreferrer"&gt;see here.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  I hope you liked my article!
&lt;/h3&gt;

&lt;p&gt;If you did you might also like what I am doing on &lt;strong&gt;Twitter&lt;/strong&gt;. I am hosting live Twitter Spaces about Angular with GDEs &amp;amp; industry experts! You can participate live, ask your questions or watch replays in a form of short clips :)&lt;/p&gt;

&lt;p&gt;If you are interested drop me a follow on &lt;strong&gt;Twitter &lt;a href="https://twitter.com/DanielGlejzner" rel="noopener noreferrer"&gt;@DanielGlejzner&lt;/a&gt; — would mean a lot :). Thank You!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
