{"id":35016,"date":"2026-09-28T17:45:57","date_gmt":"2026-09-28T15:45:57","guid":{"rendered":"https:\/\/www.angulararchitects.io\/?p=35016"},"modified":"2026-09-28T17:50:59","modified_gmt":"2026-09-28T15:50:59","slug":"angular-22-2-error-boundaries-router-resources-and-more","status":"publish","type":"post","link":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/","title":{"rendered":"Angular 22.2: Error Boundaries, Router Resources, and More"},"content":{"rendered":"<p>Angular 22.2 was released at the end of September 2026. Two additions stand out, both as developer previews: <strong>Error boundaries<\/strong> catch errors while rendering a section of a template and show a fallback view instead. <strong>Router Resources<\/strong> load route data with resources instead of resolvers, in parallel rather than one after another. This article shows both using our demo application Flights42 and then summarizes further interesting changes from the changelog.<\/p>\n<p>\ud83d\udcc2 <a href=\"https:\/\/github.com\/angular-architects\/flights42\/tree\/22.2\">Source code<\/a> (branch: <code>22.2<\/code>)<\/p>\n<h2>Error Boundaries with @boundary<\/h2>\n<p>When a template threw an exception while rendering, there was no elegant way to limit its impact to one part of the page. The error ended up in the global <code>ErrorHandler<\/code>, and the affected view remained incomplete. The new @boundary block lets you protect any section of a template: if an error occurs inside it during the initial render or a later change detection, Angular stops rendering that section and shows the associated @error block instead. The concept is inspired by error boundaries in React.<\/p>\n<p>Resources are a typical use case. If a resource's loader fails, its <code>value()<\/code> throws the error as an exception. This behavior is intentional: if <code>value()<\/code> silently returned an empty value in the error case, the error could easily go unnoticed. Until now, a template therefore had to check the <code>error()<\/code> signal before accessing <code>value()<\/code>. For the luggage detail page of the demo, that looked like this:<\/p>\n<pre><code class=\"language-html\">@let resource = luggage();\n\n@if (resource.isLoading()) {\n  &lt;p&gt;Loading luggage \u2026&lt;\/p&gt;\n} @else if (resource.error()) {\n  &lt;p&gt;Luggage could not be loaded.&lt;\/p&gt;\n} @else {\n  @let item = resource.value();\n  &lt;form&gt; [...] &lt;\/form&gt;\n}<\/code><\/pre>\n<p>With Angular 22.2, a @boundary block takes over this job:<\/p>\n<pre><code class=\"language-html\">&lt;!-- [...]\/luggage\/feature-luggage\/luggage-detail\/luggage-detail.html --&gt;\n\n@boundary {\n  @let resource = luggage();\n  @let item = resource.value();\n\n  @if (resource.isLoading()) {\n    &lt;p&gt;Loading luggage \u2026&lt;\/p&gt;\n  } @else {\n    &lt;form&gt; [...] &lt;\/form&gt;\n  }\n} @error {\n  &lt;p&gt;Luggage could not be loaded.&lt;\/p&gt;\n}\n\n&lt;p class=&quot;mt-40&quot;&gt;\n  &lt;a routerLink=&quot;\/luggage&quot;&gt;Back to overview&lt;\/a&gt;\n&lt;\/p&gt;<\/code><\/pre>\n<p>The component receives the resource as an input from the router. More on that in a moment. The template now simply reads the value without checking the error state first. If <code>value()<\/code> throws, the boundary catches the exception and renders the @error block. The link back to the overview is outside the boundary and therefore stays visible in any case. Navigating to the detail page in the demo with an invalid id, e.g. <code>\/luggage\/9999<\/code>, makes the loader throw an error, and the page shows the message from the @error block.<\/p>\n<p>A boundary can span any part of the template and also protects the components used within it: if a child component throws while rendering or during change detection, the error also ends up in the closest enclosing boundary. Boundaries can be nested. Two points are worth noting: the boundary doesn't catch errors in projected content, that is, in <code>&lt;ng-content&gt;<\/code>, and errors inside the @error block itself propagate to the next outer boundary.<\/p>\n<h2>Handling Caught Errors<\/h2>\n<p>The @error block provides the error via the implicit variable <code>$error<\/code>, similar to <code>$index<\/code> in @for. It can be renamed with <code>let<\/code>, and <code>when<\/code> allows several blocks for different kinds of errors. For the optimists, there is also the implicit function <code>$reset<\/code>, which simply tries rendering once more:<\/p>\n<pre><code class=\"language-html\">@boundary {\n  &lt;app-chart \/&gt;\n} @error (let err; retry = $reset; when isNetworkError(err)) {\n  &lt;p&gt;{{ err.message }}&lt;\/p&gt;\n  &lt;button (click)=&quot;retry()&quot;&gt;Retry&lt;\/button&gt;\n} @error {\n  &lt;p&gt;Something went wrong.&lt;\/p&gt;\n}<\/code><\/pre>\n<p>A caught error doesn't silently disappear into the fallback view. Angular additionally reports it to the <code>ErrorHandler<\/code>, namely to its new optional method <code>onViewError<\/code> if implemented, otherwise to <code>handleError<\/code>. Without a custom <code>ErrorHandler<\/code>, the error therefore still shows up in the console.<\/p>\n<p>Errors can also be caught when creating components and views dynamically: <code>createComponent<\/code> and the corresponding methods of <code>ViewContainerRef<\/code> accept an <code>onError<\/code> callback. Besides the error, both <code>onViewError<\/code> and <code>onError<\/code> receive an <code>ErrorDetails<\/code> object that names the affected component and, if present, the catching boundary along with its <code>reset<\/code> function. Error boundaries ship in 22.2 as a developer preview.<\/p>\n<p><div style=\"\nmargin: 8px 0;\npadding: 22px;\nborder: 1px solid #e5e7eb;\nborder-radius: 14px;\nbackground: #f8fafc;\n\">NOTE<\/p>\n<h3 style=\"margin-top:0\">Modern Angular<\/h3>\n<\/p>\n<p style=\"margin:0 0 12px 0\"><strong style=\"display:inline-block; background:#16a34a; color:#fff; padding:4px 10px; border-radius:999px; font-size:0.85em\">\u2713 Already updated to Angular 22!<\/strong><\/p>\n<p>You'll find more on resources, Signals, and modern Angular architecture in my new eBook Modern Angular. It covers Signals, architecture, testing, AI assistants, and practical solutions for modern business applications.<\/p>\n<p><a href=\"https:\/\/www.angulararchitects.io\/modern-book\"><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/01\/cover-klein.png\" width=\"400\" alt=\"Modern Angular - Signal-first, Architecture-first, Practice-first\" style=\"cursor:pointer !important\"><\/a><\/p>\n<p><a style=\"cursor:pointer !important\" href=\"https:\/\/www.angulararchitects.io\/modern-book\">More about the book \u2192<\/a>\n<\/div>\n<\/p>\n<h2>Router Resources<\/h2>\n<p>Resolvers load data before a route is activated and return an Observable or Promise for it. In Angular's Signal world, that felt out of place. Router Resources now solve this and also bring a performance benefit: the router starts all resources of a navigation at the same time, whereas it processes resolvers one after another along the route hierarchy. If, for example, the parent route needs 2 seconds for its data and the child route 3, the user waits 5 seconds for the navigation with resolvers. With Router Resources, it takes only 3 seconds, as long as the slowest resource.<\/p>\n<p>The feature is enabled via <code>withRouterResources<\/code>:<\/p>\n<pre><code class=\"language-typescript\">\/\/ src\/app\/app.config.ts\n\nimport {\n  provideRouter,\n  withComponentInputBinding,\n  withRouterResources,\n} from &#039;@angular\/router&#039;;\n\n[...]\n\nprovideRouter(routes, withComponentInputBinding(), withRouterResources()),<\/code><\/pre>\n<p>A route declares its data in the <code>resources<\/code> property. The function runs in an injection context and receives a <code>ResourceContext<\/code> with <code>params<\/code>, <code>queryParams<\/code>, <code>fragment<\/code>, and <code>data<\/code> as Signals. The route for editing a passenger loads the record before the component appears:<\/p>\n<pre><code class=\"language-typescript\">\/\/ src\/app\/domains\/ticketing\/ticketing.routes.ts\n\n{\n  path: &#039;passenger-edit\/:id&#039;,\n  component: PassengerEdit,\n  resources: (ctx) =&gt; ({\n    passenger: createSimplePassengerResource(ctx.params),\n  }),\n},<\/code><\/pre>\n<p>The factory function derives the id from the parameters and creates an ordinary <code>httpResource<\/code>:<\/p>\n<pre><code class=\"language-typescript\">\/\/ [...]\/feature-booking\/passenger-edit\/simple-passenger-resource.ts\n\nexport function createSimplePassengerResource(params: Signal&lt;Params&gt;) {\n  const passengerClient = inject(PassengerClient);\n  const id = computed(() =&gt; Number(params()[&#039;id&#039;] ?? 0));\n  return passengerClient.findPassengerResourceById(id);\n}<\/code><\/pre>\n<p>Such a resource is <strong>blocking<\/strong>: like with a resolver, the router waits until the value is available. Thanks to <code>withComponentInputBinding<\/code>, the component receives the unwrapped value as an input, exactly as it did from the resolver before. In the prereleases of 22.2, a resource with a default value didn't block, because from the router's point of view a value was already present. The final release looks solely at the loading state. A default value is therefore no longer an obstacle.<\/p>\n<h2>Non-Blocking Router Resources<\/h2>\n<p>Navigation shouldn't always wait. With <code>nonBlocking<\/code>, the router activates the route immediately and hands the still-loading resource as a whole to the component. The luggage detail page from the first section uses exactly that:<\/p>\n<pre><code class=\"language-typescript\">\/\/ src\/app\/domains\/luggage\/feature-luggage\/luggage.routes.ts\n\nimport { nonBlocking, Routes } from &#039;@angular\/router&#039;;\n\n[...]\n\n{\n  path: &#039;:id&#039;,\n  component: LuggageDetail,\n  resources: (ctx) =&gt; ({\n    luggage: nonBlocking(createLuggageResource(ctx.params)),\n  }),\n},<\/code><\/pre>\n<pre><code class=\"language-typescript\">\/\/ [...]\/feature-luggage\/luggage-detail\/luggage-detail.ts\n\n@Component({ [...] })\nexport class LuggageDetail {\n  readonly luggage = input.required&lt;Resource&lt;Luggage&gt;&gt;();\n}<\/code><\/pre>\n<p>This makes <code>isLoading<\/code>, <code>error<\/code>, and <code>value<\/code> available in the template, and the error boundary from the first section takes care of the error case.<\/p>\n<p>Router Resources can do more: via the <code>ActivatedRoute<\/code>, a resource can be reloaded without a new navigation, and a <code>RedirectCommand<\/code> thrown in the loader redirects to another route when data is missing. These details, as well as the interplay with Signal Stores, are covered in the article <a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/router-resources-loading-data-with-the-angular-router\/\">Router Resources: Loading Data with the Angular Router<\/a>.<\/p>\n<h2>More at a Glance<\/h2>\n<p>Besides the two big new features, error boundaries and Router Resources, Angular 22.2 comes with numerous refinements. They touch the router, the compiler, testing, Signal Forms, and the CLI. The most interesting ones at a glance:<\/p>\n<ul>\n<li>\n<p><strong>Throwing <code>RedirectCommand<\/code>:<\/strong> Guards, resolvers, and Router Resources can now throw a <code>RedirectCommand<\/code> instead of returning it. This makes redirects easier from deeply nested calls, for instance from a <code>catch<\/code> block.<\/p>\n<\/li>\n<li>\n<p><strong>Auto cleanup for route injectors is stable:<\/strong> <code>withExperimentalAutoCleanupInjectors<\/code> becomes <code>withAutoCleanupInjectors<\/code>. The router uses it to clean up the environment injectors of routes that are no longer active. Custom <code>RouteReuseStrategy<\/code> implementations can take part in the decision via the new optional methods <code>retrieveStoredRouteHandles<\/code> and <code>shouldDestroyInjector<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong><code>containsTree<\/code> is public:<\/strong> The function checks whether one <code>UrlTree<\/code> is contained in another and accepts the same options as <code>isActive<\/code>. Until now, it was only available internally.<\/p>\n<\/li>\n<li>\n<p><strong>Private members in templates:<\/strong> Templates may now access properties and methods of the component declared as <code>private<\/code>. This makes working with <code>isolatedDeclarations<\/code> easier, because private members don't need explicit type annotations.<\/p>\n<\/li>\n<li>\n<p><strong><code>strictUnclaimedEventNames<\/code>:<\/strong> The new option in <code>angularCompilerOptions<\/code> reports event bindings that are neither an output of an applied directive nor a known DOM event, for instance <code>(userSelcted)<\/code> instead of <code>(userSelected)<\/code>. It is opt-in and applies to camelCase names.<\/p>\n<\/li>\n<li>\n<p><strong><code>TestBed.createDirective<\/code>:<\/strong> Directives can be tested without a hand-written host component. The method returns a <code>DirectiveFixture<\/code> with access to the directive instance and the host element. Inputs, outputs, and the tag name of the host are configurable.<\/p>\n<\/li>\n<li>\n<p><strong><code>Injector<\/code> via query:<\/strong> View and content queries can read the injector of the matched node with <code>{ read: Injector }<\/code>. This comes in handy when dynamically created content needs the injector of a specific place in the template.<\/p>\n<\/li>\n<li>\n<p><strong>WebMCP annotations:<\/strong> Tools that an application provides for AI agents via <code>declareExperimentalWebMcpTool<\/code> or <code>provideExperimentalWebMcpTools<\/code> now describe their behavior via <code>annotations<\/code> with the hints <code>readOnlyHint<\/code>, <code>consequentialHint<\/code>, and <code>untrustedContentHint<\/code>. Signal Forms exposed as tools via the <code>experimentalWebMcpTool<\/code> option get <code>readOnlyHint<\/code> and <code>untrustedContentHint<\/code> fixed to <code>false<\/code>, since a form by definition changes the state of the page.<\/p>\n<\/li>\n<li>\n<p><strong>Signal Forms: <code>hidden<\/code> without a condition:<\/strong> <code>hidden(path)<\/code> now hides a field permanently even without a <code>when<\/code> condition, in line with <code>readonly<\/code> and <code>disabled<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>Animations:<\/strong> <code>animate.enter<\/code> and <code>animate.leave<\/code> now also accept functions and Signals as bindings.<\/p>\n<\/li>\n<li>\n<p><strong>CLI:<\/strong> The CLI's MCP server gets a <code>--root<\/code> option that restricts access to a subtree in monorepos. <code>--stats-json<\/code> generates separate files for browser and server in SSR applications. The unit test integration moves to Vitest 5, which is why the <code>splitting<\/code> option is deprecated. The Angular linker is now based on <code>oxc-parser<\/code>, and numerous performance improvements speed up builds, including decoupling type checking from the build start, a native Sass daemon, and a new file watcher.<\/p>\n<\/li>\n<\/ul>\n<h2>Learn More: Angular Architecture Workshop (Remote, Interactive, Advanced)<\/h2>\n<p>Become an expert in enterprise-wide and long-lived Angular applications with our Angular Architecture Workshop!<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/sujet-en.jpg\" alt=\"Angular Architecture Workshop\" style=\"width:600px; max-width:100%; display: block; margin: 0 auto 0 0\" \/><\/p>\n<p><a href=\"https:\/\/www.angulararchitects.io\/training\/advanced-angular-architektur-workshop\/\">German Version<\/a> | <a href=\"https:\/\/www.angulararchitects.io\/en\/training\/advanced-angular-architecture-workshop\/\">English Version<\/a><\/p>\n<h2>Conclusion<\/h2>\n<p>Angular 22.2 is a minor release with two additions that noticeably change everyday work. Error boundaries give templates a mechanism other frameworks have known for a while, and they go well with the Resource API, whose <code>value()<\/code> throws in the error case. Router Resources bring the loading of route data into the Signal world and get rid of the resolver waterfall. Both are marked as developer previews, but the direction is set. On top of that come smaller improvements such as throwing <code>RedirectCommand<\/code>, <code>TestBed.createDirective<\/code>, and a build that gets faster thanks to decoupled type checking.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Angular 22.2 was released at the end of September 2026. Two additions stand out, both as developer previews: Error boundaries catch errors while rendering a section of a template and show a fallback view instead. Router Resources load route data with resources instead of resolvers, in parallel rather than one after another. This article shows [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":35017,"comment_status":"open","ping_status":"open","sticky":true,"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-35016","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Angular 22.2: Error Boundaries, Router Resources, and More - ANGULARarchitects<\/title>\n<meta name=\"description\" content=\"Angular 22.2 brings error boundaries with @boundary and Router Resources as developer previews. This article shows both using a demo and summarizes further changes from the changelog.\" \/>\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-22-2-error-boundaries-router-resources-and-more\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular 22.2: Error Boundaries, Router Resources, and More - ANGULARarchitects\" \/>\n<meta property=\"og:description\" content=\"Angular 22.2 brings error boundaries with @boundary and Router Resources as developer previews. This article shows both using a demo and summarizes further changes from the changelog.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/\" \/>\n<meta property=\"og:site_name\" content=\"ANGULARarchitects\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-28T15:45:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-28T15:50:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/09\/social-sujet-2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1260\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Manfred Steyer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/09\/social-sujet-2.png\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Manfred Steyer\" \/>\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\":\"TechArticle\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/\"},\"author\":{\"name\":\"Manfred Steyer\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/f3de69c1e2bdb5ba04d8d2f5f998b81a\"},\"headline\":\"Angular 22.2: Error Boundaries, Router Resources, and More\",\"datePublished\":\"2026-09-28T15:45:57+00:00\",\"dateModified\":\"2026-09-28T15:50:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/\"},\"wordCount\":1439,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/09\/hero-1.png\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/\",\"name\":\"Angular 22.2: Error Boundaries, Router Resources, and More - ANGULARarchitects\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/09\/hero-1.png\",\"datePublished\":\"2026-09-28T15:45:57+00:00\",\"dateModified\":\"2026-09-28T15:50:59+00:00\",\"description\":\"Angular 22.2 brings error boundaries with @boundary and Router Resources as developer previews. This article shows both using a demo and summarizes further changes from the changelog.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#primaryimage\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/09\/hero-1.png\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/09\/hero-1.png\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.angulararchitects.io\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular 22.2: Error Boundaries, Router Resources, and More\"}]},{\"@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\/f3de69c1e2bdb5ba04d8d2f5f998b81a\",\"name\":\"Manfred Steyer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8778dfb353992fa3a0d909beee085a088891e5bfce65cdb3631801da527cf11b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8778dfb353992fa3a0d909beee085a088891e5bfce65cdb3631801da527cf11b?s=96&d=mm&r=g\",\"caption\":\"Manfred Steyer\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Angular 22.2: Error Boundaries, Router Resources, and More - ANGULARarchitects","description":"Angular 22.2 brings error boundaries with @boundary and Router Resources as developer previews. This article shows both using a demo and summarizes further changes from the changelog.","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-22-2-error-boundaries-router-resources-and-more\/","og_locale":"en_US","og_type":"article","og_title":"Angular 22.2: Error Boundaries, Router Resources, and More - ANGULARarchitects","og_description":"Angular 22.2 brings error boundaries with @boundary and Router Resources as developer previews. This article shows both using a demo and summarizes further changes from the changelog.","og_url":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/","og_site_name":"ANGULARarchitects","article_published_time":"2026-09-28T15:45:57+00:00","article_modified_time":"2026-09-28T15:50:59+00:00","og_image":[{"width":2400,"height":1260,"url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/09\/social-sujet-2.png","type":"image\/png"}],"author":"Manfred Steyer","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/09\/social-sujet-2.png","twitter_misc":{"Written by":"Manfred Steyer","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#article","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/"},"author":{"name":"Manfred Steyer","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/f3de69c1e2bdb5ba04d8d2f5f998b81a"},"headline":"Angular 22.2: Error Boundaries, Router Resources, and More","datePublished":"2026-09-28T15:45:57+00:00","dateModified":"2026-09-28T15:50:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/"},"wordCount":1439,"commentCount":0,"publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/09\/hero-1.png","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/","url":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/","name":"Angular 22.2: Error Boundaries, Router Resources, and More - ANGULARarchitects","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#primaryimage"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/09\/hero-1.png","datePublished":"2026-09-28T15:45:57+00:00","dateModified":"2026-09-28T15:50:59+00:00","description":"Angular 22.2 brings error boundaries with @boundary and Router Resources as developer previews. This article shows both using a demo and summarizes further changes from the changelog.","breadcrumb":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#primaryimage","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/09\/hero-1.png","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/09\/hero-1.png","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-22-2-error-boundaries-router-resources-and-more\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.angulararchitects.io\/en\/"},{"@type":"ListItem","position":2,"name":"Angular 22.2: Error Boundaries, Router Resources, and More"}]},{"@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\/f3de69c1e2bdb5ba04d8d2f5f998b81a","name":"Manfred Steyer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8778dfb353992fa3a0d909beee085a088891e5bfce65cdb3631801da527cf11b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8778dfb353992fa3a0d909beee085a088891e5bfce65cdb3631801da527cf11b?s=96&d=mm&r=g","caption":"Manfred Steyer"}}]}},"_links":{"self":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/35016","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\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/comments?post=35016"}],"version-history":[{"count":2,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/35016\/revisions"}],"predecessor-version":[{"id":35025,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/35016\/revisions\/35025"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media\/35017"}],"wp:attachment":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media?parent=35016"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/categories?post=35016"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/tags?post=35016"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}