{"id":6979,"date":"2023-03-02T04:36:01","date_gmt":"2023-03-02T03:36:01","guid":{"rendered":"https:\/\/www.angulararchitects.io\/?p=6979"},"modified":"2025-06-05T09:47:19","modified_gmt":"2025-06-05T07:47:19","slug":"angular-signals","status":"publish","type":"post","link":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/","title":{"rendered":"Signals in Angular: Building Blocks"},"content":{"rendered":"<div class=\"wp-post-series-box series-signals wp-post-series-box--expandable\">\n\t\t\t<input id=\"collapsible-series-signals69e344c5bc612\" class=\"wp-post-series-box__toggle_checkbox\" type=\"checkbox\">\n\t\n\t<label\n\t\tclass=\"wp-post-series-box__label\"\n\t\t\t\t\tfor=\"collapsible-series-signals69e344c5bc612\"\n\t\t\ttabindex=\"0\"\n\t\t\t\t>\n\t\t<p class=\"wp-post-series-box__name wp-post-series-name\">\n\t\t\tThis is post 1 of 9 in the series <em>&ldquo;Signals&rdquo;<\/em>\t\t<\/p>\n\t\t\t<\/label>\n\n\t\t\t<div class=\"wp-post-series-box__posts\">\n\t\t\t<ol>\n\t\t\t\t\t\t\t\t\t<li><span class=\"wp-post-series-box__current\">Signals in Angular: Building Blocks<\/span><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/component-communication-with-signals-inputs-two-way-bindings-and-content-view-queries\/\">Component Communication with Signals: Inputs, Two-Way Bindings, and Content\/ View Queries<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/successful-with-signals-in-angular-3-effective-rules-for-your-architecture\/\">Successful with Signals in Angular &#8211; 3 Effective Rules for Your Architecture<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/skillfully-using-signals-in-angular-selected-hints-for-professional-use\/\">Skillfully Using Signals in Angular &#8211; Selected Hints for Professional Use<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/when-not-to-use-effects-in-angular-and-what-to-do-instead\/\">When (Not) to use Effects in Angular &#8212; and what to do instead<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/asynchronous-resources-with-angulars-new-resource-api\/\">Asynchronous Data Flow with Angular&#8217;s new Resource API<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/streaming-resources-in-angular-19-2-details-and-semantics\/\">Streaming Resources in Angular &#8211; Details and Semantics<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/streaming-resources-for-a-chat-with-web-sockets-messages-in-a-glitch-free-world\/\">Streaming Resources for a Chat with Web Sockets: Messages in a Glitch-Free World<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/learning-httpresource-with-super-mario\/\">Angular&#8217;s new httpResource<\/a><\/li>\n\t\t\t\t\t\t\t<\/ol>\n\t\t<\/div>\n\t<\/div>\n<p>With the introduction of Signals, Angular provides a new reactive building block that makes state management significantly simpler. Its lightweight and accessible API is ideal for developers who want a straightforward way into reactive programming. Many common use cases can now be implemented with minimal code.<\/p>\n<p>RxJS remains the powerful solution for advanced scenarios like streams, cancelation, and complex data flow. The good news: Signals and RxJS integrate seamlessly. This interoperability allows developers to combine simplicity and flexibility as needed.<\/p>\n<p>Signals also work hand in hand with Angular\u2019s OnPush change detection strategy and are designed to support the upcoming zone-less change detection. In fact, they may serve as the foundation for even more fine-grained change detection mechanisms in the future.<\/p>\n<p>This article series explores how to use Angular Signals effectively\u2014from the basics to advanced patterns. This first part covers the foundational building blocks:<br \/>\n<code>signal<\/code>, <code>computed<\/code>, <code>effect<\/code>, and <code>untracked<\/code>.<\/p>\n<p>\ud83d\udcc2 <a href=\"https:\/\/github.com\/manfredsteyer\/standalone-example-cli\">Source Code<\/a> (see <strong>branches<\/strong> <code>signal<\/code> and <code>signal-rxjs-interop<\/code>)<\/p>\n<h2>Using Signals<\/h2>\n<p>For using Signals with data binding, properties to be bound are expressed as signals:<\/p>\n<pre><code class=\"language-typescript\">@Component([\u2026])\nexport class FlightSearchComponent {\n\n  private flightService = inject(FlightService);\n\n  from = signal(&#039;Hamburg&#039;);\n  to = signal(&#039;Graz&#039;);\n  flights = signal&lt;Flight[]&gt;([]);\n\n  [\u2026]\n\n}<\/code><\/pre>\n<p>It should be noted here that a Signal always has a value. Therefore, a default value must be passed to the <code>signal<\/code> function. If the data type cannot be derived from this, the example specifies it explicitly via a type parameter.<\/p>\n<p>The Signal's getter is used to read the value of a signal. Technically, this means that the signal is called like a function:<\/p>\n<pre><code class=\"language-typescript\">async search(): Promise&lt;void&gt; {\n  if (!this.from() || !this.to()) {\n    return;\n  }\n  const flights = await this.flightService.findAsPromise(this.from(), this.to());\n  this.flights.set(flights);\n}<\/code><\/pre>\n<p>To set the value, the signal offers an explicit setter in the form of a <code>set<\/code> method. The example shown uses the setter to stow the loaded flights. The getter is also used for data binding in the template:<\/p>\n<pre><code class=\"language-html\">&lt;div *ngIf=&quot;flights().length &gt; 0&quot;&gt;\n  {{flights().length}} flights found!\n&lt;\/div&gt;\n\n&lt;div class=&quot;row&quot;&gt;\n  &lt;div *ngFor=&quot;let f of flights()&quot;&gt;\n    &lt;flight-card [item]=&quot;f&quot; \/&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>Method calls were frowned upon in templates in the past, especially since they could lead to performance bottlenecks. However, this does not generally apply to uncomplex routines such as getters. In addition, the template will appear here as a consumer, and as such, it can be notified of changes.<\/p>\n<p>Meanwhile, Angular's Two-Way-Bindings directly support Signals:<\/p>\n<pre><code class=\"language-html\">&lt;form #form=&quot;ngForm&quot;&gt;\n  &lt;div class=&quot;form-group&quot;&gt;\n    &lt;label&gt;From:&lt;\/label&gt;\n    &lt;input [(ngModel)]=&quot;from&quot; name=&quot;from&quot; class=&quot;form-control&quot;&gt;\n  &lt;\/div&gt;\n\n  &lt;div class=&quot;form-group&quot;&gt;\n    &lt;label&gt;To:&lt;\/label&gt;\n    &lt;input [(ngModel)]=&quot;to&quot; name=&quot;to&quot; class=&quot;form-control&quot;&gt;\n  &lt;\/div&gt;\n\n  &lt;div class=&quot;form-group&quot;&gt;\n    &lt;button class=&quot;btn btn-default&quot; (click)=&quot;search()&quot;&gt;Search&lt;\/button&gt;\n    &lt;button class=&quot;btn btn-default&quot; (click)=&quot;delay()&quot;&gt;Delay&lt;\/button&gt;\n  &lt;\/div&gt;\n&lt;\/form&gt;<\/code><\/pre>\n<p>In a future version, the Angular team will adopt the forms handling to Signals.<\/p>\n<h2>Updating Signals<\/h2>\n<p>In addition to the setter shown earlier, Signals also provide an <code>update<\/code> method for projecting the current value to a new one:<\/p>\n<pre><code class=\"language-typescript\">this.flights.update(f =&gt; {\n  const flight = f[0];\n  const date = addMinutes(flight.date, 15);\n  const updated = {...flight, date};\n\n  return [\n    updated,\n    ...f.slice(1)\n  ];\n});<\/code><\/pre>\n<h2>Signal Values Should to be Immutable<\/h2>\n<p>By default, a Signal's is supposed to be immutable. For this reason, just updating the flight date in the previous section would not be sufficient. Instead, we have to clone the changed parts, so that they get a new object reference. <\/p>\n<p>By comparing these references, Angular's <code>OnPush<\/code> change detection strategy can efficiently determine the changed parts of an object managed by a Signal. In the previous section, the Array and the first flight get an new object reference. The other flights are not changed and hence just copied over using <code>slice<\/code>. As a result, they keep their object reference. <\/p>\n<h2>Calculated Values, Side Effects, and Assertions<\/h2>\n<p>Some values are derived from existing values. Angular provides calculated signals for this:<\/p>\n<pre><code class=\"language-typescript\">flightRoute = computed(() =&gt; this.from() + &#039; to &#039; + this.to());<\/code><\/pre>\n<p>Such a signal is read-only and appears as both a consumer and a producer. As a consumer, it retrieves the values of the signals used - here <code>from<\/code> and <code>to<\/code> - and is informed about changes. As a producer, it returns a calculated.<\/p>\n<p>If you want to consume signals programmatically, you can use the <code>effect<\/code> function:<\/p>\n<pre><code class=\"language-typescript\">constructor() {\n    effect(() =&gt; {\n        console.log(&#039;from:&#039;, this.from());\n        console.log(&#039;route:&#039;, this.flightRoute());\n    });\n}<\/code><\/pre>\n<p>The <code>effect<\/code> function executes the transferred lambda expression and registers itself as a consumer for the signals used. When one of these signals change, the the effect is triggered again.<\/p>\n<p>Please note that usually, Signals are consumed via data binding. However, in some cases, we need a function or method call in order to present a Signal's value to the user. Examples are logging or displaying a toast message. Please find more <a href=\"https:\/\/www.angulararchitects.io\/blog\/when-not-to-use-effects-in-angular-and-what-to-do-instead\/\">details on the ideas behind effects here<\/a>.<\/p>\n<h2>Injection Context needed<\/h2>\n<p>Several building blocks for Signals such as <code>effect<\/code> can only be used in an injection context. This is everywhere <code>inject<\/code> is allowed: in the constructor, as default values of class fields, and in provider factories. Also, you can use the <code>runInInjectionContext<\/code> function to run code in an injection context.<\/p>\n<p>Hence, the effect set up in the constructor above would fail when placed in <code>ngOnInit<\/code> or in another method:<\/p>\n<pre><code class=\"language-typescript\">ngOnInit(): void {\n    \/\/ Effects are not allowed here.\n    \/\/ Hence, this will fail:\n    effect(() =&gt; {\n        console.log(&#039;route:&#039;, this.flightRoute());\n    });\n}<\/code><\/pre>\n<p>In this case, you'd get the following error:<\/p>\n<blockquote>\n<p>ERROR Error: NG0203: effect() can only be used within an injection context such as a constructor, a factory function,<\/p>\n<\/blockquote>\n<p>The technical reason is that effects use <code>inject<\/code> to get hold of the current <code>DestroyRef<\/code>. This service provided since Angular 16 helps to find out about the life span of the current building block, e. g. the current component or service. The effect uses the <code>DestroyRef<\/code> to &quot;unsubscribe&quot; itself when this building block is about to be destroyed.<\/p>\n<p>For this reason, you would typically setup your effects in the constructor as shown in the last section. If you really want to setup an effect somewhere else, you can go with the <code>runInInjectionContext<\/code> function. However, it needs a reference to an <code>Injector<\/code>:<\/p>\n<pre><code class=\"language-typescript\">injector = inject(Injector);\n\nngOnInit(): void {\n  runInInjectionContext(this.injector, () =&gt; {\n    effect(() =&gt; {\n      console.log(&#039;route:&#039;, this.flightRoute());\n    });\n  });\n}<\/code><\/pre>\n<h2>Glitch-Free Property<\/h2>\n<p>If a signal changes several times in a row or if several signals change one after the other, undesired interim results could occur. Let's imagine we change the search filter <code>Hamburg - Graz<\/code> to <code>London - Paris<\/code>:<\/p>\n<pre><code class=\"language-typescript\">setTimeout(() =&gt; {\n  this.from.set(&#039;London&#039;);\n  this.to.set(&#039;Paris&#039;);\n}, 2000);<\/code><\/pre>\n<p>Here, <code>London - Graz<\/code> could come immediately after the setting <code>from<\/code> to <code>London<\/code>. Like many other Signal implementations, Angular's implementation prevents such occurrences. The Angular team's <a href=\"https:\/\/github.com\/angular\/angular\/blob\/71d5cdae195f916e345d977f1f23f9490e09482e\/packages\/core\/src\/signals\/README.md\">readme<\/a>, which also explains the push\/pull algorithm used, calls this desirable assurance &quot;glitch-free&quot;.<\/p>\n<h2>Signals and Change Detection<\/h2>\n<p>Similar to an Observable bound to a template using the <code>async<\/code>-Pipe, a bound Signal triggers change detection. This also works for the more efficient <code>OnPush<\/code> mode:<\/p>\n<pre><code class=\"language-typescript\">@Component({\n  [...]\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FlightSearchComponent { [...] } \n\n[...]\n\n@Component({\n  [...]\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FlightCardComponent { [...] } <\/code><\/pre>\n<p>However, to help Angular in <code>OnPush<\/code> mode to also find out about child components to look at, you have to use Immutables, as discussed above.<\/p>\n<h2>RxJS Interop<\/h2>\n<p>Admittedly, at first glance, signals are very similar to a mechanism that Angular has been using for a long time, namely RxJS Observables. However, signals are deliberately kept simpler. <\/p>\n<p>If you need the power of RxJS and its operators, you can however convert them to Observables. The namespace <code>@angular\/core\/rxjs-interop<\/code> contains a function <code>toObservable<\/code> converting a Signal into an Observable and a function <code>toSignal<\/code> for the other way round. They allow using the simplicity of signals with the power of RxJS.<\/p>\n<p>The following listing illustrates the use of these two methods by expanding the example shown into a debounced type-ahead:<\/p>\n<pre><code class=\"language-typescript\">@Component([...])\nexport class FlightSearchComponent {\n  private flightService = inject(FlightService);\n\n  from = signal(&#039;Hamburg&#039;);\n  to = signal(&#039;Graz&#039;);\n  basket = signal&lt;Record&lt;number, boolean&gt;&gt;({ 1: true });\n  flightRoute = computed(() =&gt; this.from() + &#039; to &#039; + this.to());\n\n  from$ = toObservable(this.from);\n  to$ = toObservable(this.to);\n\n  flights$ = combineLatest({ from: this.from$, to: this.to$ }).pipe(\n    filter(c =&gt; c.from.length &gt;= 3 &amp;&amp; c.to.length &gt;= 3),\n    debounceTime(300),\n    switchMap(c =&gt; this.flightService.find(c.from, c.to))\n  );\n\n  flights = toSignal(this.flights$, {\n    initialValue: []\n  });\n}<\/code><\/pre>\n<p>The example converts the signals <code>from<\/code> and <code>to<\/code> into the observables <code>from$<\/code> and <code>to$<\/code> and combines them with <code>combineLatest<\/code>. As soon as one of the values changes, filtering and debouncing occur before <code>switchMap<\/code> triggers the backend request. One of the benefits flattening operators like <code>switchMap<\/code> come with are guarantees in terms of asynchronicity. These guarantees help to avoid race conditions.<\/p>\n<p>The <code>initialValue<\/code> passed to toSignal is needed because Signals always have a value. On the contrary, Observables might not emit a value at all. If you are sure your Observable has an initial value, e.g., because it's a <code>BehaviorSubject<\/code> or because of using the <code>startsWith<\/code> operator, you can also set <code>requireSync<\/code> to <code>true<\/code>:<\/p>\n<pre><code class=\"language-typescript\">flights = toSignal(this.flights, { \n    requireSync: true\n});<\/code><\/pre>\n<p>If you neither set <code>initialValue<\/code> nor <code>requireSync<\/code>, the type of the returned Signal also supports the <code>undefinied<\/code> type, allowing an initial value of <code>undefined<\/code>. In the example shown, this would result in a <code>Signal&lt;Flight[] | undefinied&gt;<\/code> instead of <code>Signal&lt;Flight[]&gt;<\/code>. Consequently, your code has to check for <code>undefined<\/code> too.<\/p>\n<h2>Conclusion<\/h2>\n<p>Signals make reactivity in Angular more lightweight. They make usual use cases simple and for more complex use cases we can bridge over to RxJS using a first-class interop implementation.<\/p>\n<p>The Angular team remains true to itself: Signals are not hidden in the substructure or behind proxies but made explicit. Developers therefore always know which data structure they are actually dealing with. Also, signals are just an option. No one needs to change legacy code and a combination of traditional change detection and signal-based change detection will be possible.<\/p>\n<h2>More on Modern Angular?<\/h2>\n<p>Learn all about Standalone Components in our free eBook:<\/p>\n<ul>\n<li>The mental model behind Standalone Components<\/li>\n<li>Migration scenarios and compatibility with existing code<\/li>\n<li>Standalone Components and the router and lazy loading<\/li>\n<li>Standalone Components and Web Components<\/li>\n<li>Standalone Components and DI and NGRX<\/li>\n<\/ul>\n<p>Please find our eBook here:<\/p>\n<p><a href=\"https:\/\/www.angulararchitects.io\/standalone-book\"><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2022\/10\/title-page-small.jpg\" alt=\"free\" \/><\/a><\/p>\n<p>Feel free to <a href=\"https:\/\/www.angulararchitects.io\/standalone-book\">download it here<\/a> now!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Angular is going to rely on a reactive mechanism called Signals to make change detection more lightweight and powerful.<\/p>\n","protected":false},"author":9,"featured_media":6980,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"footnotes":""},"categories":[18],"tags":[],"class_list":["post-6979","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","post_series-signals"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Signals in Angular: Building Blocks - ANGULARarchitects<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Signals in Angular: Building Blocks - ANGULARarchitects\" \/>\n<meta property=\"og:description\" content=\"Angular is going to rely on a reactive mechanism called signal to make change detection more lightweight and powerful.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/\" \/>\n<meta property=\"og:site_name\" content=\"ANGULARarchitects\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-02T03:36:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-05T07:47:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/03\/signals-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Manfred Steyer, GDE\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Angular is going to rely on a reactive mechanism called signal to make change detection more lightweight and powerful.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/03\/signals-1.png\" \/>\n<meta name=\"twitter:creator\" content=\"@daniel\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Manfred Steyer, GDE\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/\"},\"author\":{\"name\":\"Manfred Steyer, GDE\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951\"},\"headline\":\"Signals in Angular: Building Blocks\",\"datePublished\":\"2023-03-02T03:36:01+00:00\",\"dateModified\":\"2025-06-05T07:47:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/\"},\"wordCount\":1328,\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/03\/shutterstock-1898594407.jpg\",\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/\",\"name\":\"Signals in Angular: Building Blocks - ANGULARarchitects\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/03\/shutterstock-1898594407.jpg\",\"datePublished\":\"2023-03-02T03:36:01+00:00\",\"dateModified\":\"2025-06-05T07:47:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#primaryimage\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/03\/shutterstock-1898594407.jpg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/03\/shutterstock-1898594407.jpg\",\"width\":1000,\"height\":390},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.angulararchitects.io\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Signals in Angular: Building Blocks\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"name\":\"ANGULARarchitects\",\"description\":\"AngularArchitects.io\",\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\",\"name\":\"ANGULARarchitects\",\"alternateName\":\"SOFTWAREarchitects\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"width\":644,\"height\":216,\"caption\":\"ANGULARarchitects\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/github.com\/angular-architects\",\"https:\/\/www.linkedin.com\/company\/angular-architects\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951\",\"name\":\"Manfred Steyer, GDE\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g\",\"caption\":\"Manfred Steyer, GDE\"},\"sameAs\":[\"https:\/\/x.com\/daniel\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Signals in Angular: Building Blocks - ANGULARarchitects","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/","og_locale":"en_US","og_type":"article","og_title":"Signals in Angular: Building Blocks - ANGULARarchitects","og_description":"Angular is going to rely on a reactive mechanism called signal to make change detection more lightweight and powerful.","og_url":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/","og_site_name":"ANGULARarchitects","article_published_time":"2023-03-02T03:36:01+00:00","article_modified_time":"2025-06-05T07:47:19+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/03\/signals-1.png","type":"image\/png"}],"author":"Manfred Steyer, GDE","twitter_card":"summary_large_image","twitter_description":"Angular is going to rely on a reactive mechanism called signal to make change detection more lightweight and powerful.","twitter_image":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/03\/signals-1.png","twitter_creator":"@daniel","twitter_misc":{"Written by":"Manfred Steyer, GDE","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#article","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/"},"author":{"name":"Manfred Steyer, GDE","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951"},"headline":"Signals in Angular: Building Blocks","datePublished":"2023-03-02T03:36:01+00:00","dateModified":"2025-06-05T07:47:19+00:00","mainEntityOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/"},"wordCount":1328,"publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/03\/shutterstock-1898594407.jpg","inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/","url":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/","name":"Signals in Angular: Building Blocks - ANGULARarchitects","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#primaryimage"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/03\/shutterstock-1898594407.jpg","datePublished":"2023-03-02T03:36:01+00:00","dateModified":"2025-06-05T07:47:19+00:00","breadcrumb":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#primaryimage","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/03\/shutterstock-1898594407.jpg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/03\/shutterstock-1898594407.jpg","width":1000,"height":390},{"@type":"BreadcrumbList","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-signals\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.angulararchitects.io\/en\/"},{"@type":"ListItem","position":2,"name":"Signals in Angular: Building Blocks"}]},{"@type":"WebSite","@id":"https:\/\/www.angulararchitects.io\/en\/#website","url":"https:\/\/www.angulararchitects.io\/en\/","name":"ANGULARarchitects","description":"AngularArchitects.io","publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.angulararchitects.io\/en\/#organization","name":"ANGULARarchitects","alternateName":"SOFTWAREarchitects","url":"https:\/\/www.angulararchitects.io\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","width":644,"height":216,"caption":"ANGULARarchitects"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/github.com\/angular-architects","https:\/\/www.linkedin.com\/company\/angular-architects\/"]},{"@type":"Person","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951","name":"Manfred Steyer, GDE","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g","caption":"Manfred Steyer, GDE"},"sameAs":["https:\/\/x.com\/daniel"]}]}},"_links":{"self":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/6979","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/comments?post=6979"}],"version-history":[{"count":6,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/6979\/revisions"}],"predecessor-version":[{"id":30548,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/6979\/revisions\/30548"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media\/6980"}],"wp:attachment":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media?parent=6979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/categories?post=6979"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/tags?post=6979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}