<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:webfeeds="http://webfeeds.org/rss/1.0" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Routing on Mart&#39;s blog</title>
    <link>https://blog.martdegraaf.nl/tags/routing/</link>
    <description>Recent content in Routing on Mart&#39;s blog</description>
    <webfeeds:analytics id="G-ZFQGR29JJQ" engine="GoogleAnalytics"/>
    <webfeeds:accentColor>0078D3</webfeeds:accentColor>
    <webfeeds:related layout="card" target="browser"/>
    <webfeeds:icon>https://gravatar.com/userimage/91624600/fb51d6d9172e5043a1e59d59f3f84e62.jpeg?v=1666815123000&amp;size=200</webfeeds:icon>
    <generator>Hugo -- 0.161.1</generator>
    <language>en-us</language>
    <managingEditor>blog@martdegraaf.nl (Mart de Graaf)</managingEditor>
    <webMaster>blog@martdegraaf.nl (Mart de Graaf)</webMaster>
    <copyright>Mart de Graaf</copyright>
    <lastBuildDate>Fri, 03 May 2024 00:08:07 +0200</lastBuildDate>
    <atom:link href="https://blog.martdegraaf.nl/tags/routing/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Angular Relative Navigation</title>
      <link>https://blog.martdegraaf.nl/posts/angular-relative-navigation/</link>
      <pubDate>Thu, 25 Apr 2024 07:47:30 +0200</pubDate><author>blog@martdegraaf.nl (Mart de Graaf)</author>
      <guid>https://blog.martdegraaf.nl/posts/angular-relative-navigation/</guid>
      <description><![CDATA[Learn how to navigate to a route relative to the current route in Angular. This is useful when you have a wizard-like flow in your application.]]></description>
      <enclosure url="https://blog.martdegraaf.nl/posts/angular-relative-navigation/cover.webp" type="image/webp" />
      <media:content url="https://blog.martdegraaf.nl/posts/angular-relative-navigation/cover.webp" medium="image" type="image/webp">
        <media:title>Routing</media:title>
      </media:content><content:encoded><![CDATA[<img src="https://blog.martdegraaf.nl/posts/angular-relative-navigation/cover.webp" alt="Routing" /><br/><br/><p>For a project, we have routes that live in states. We wanted to navigate to a route relative to the current route. for each child route, we will be able to navigate to the previous and next route.</p>
<h2 id="system-context">System context</h2>
<p>Let&rsquo;s say we have a <code>app-routing.module.ts</code> with the following routes:</p>
<div class="codecontainer" hi="mart"><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">routes</span>: <span class="kt">Routes</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">path</span><span class="o">:</span> <span class="s1">&#39;parent&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">component</span>: <span class="kt">ParentComponent</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">children</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">path</span><span class="o">:</span> <span class="s1">&#39;child1&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">component</span>: <span class="kt">Child1Component</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">data</span><span class="o">:</span> <span class="p">{</span> <span class="nx">stepName</span><span class="o">:</span> <span class="s1">&#39;child1&#39;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">path</span><span class="o">:</span> <span class="s1">&#39;child2&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">component</span>: <span class="kt">Child2Component</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">data</span><span class="o">:</span> <span class="p">{</span> <span class="nx">stepName</span><span class="o">:</span> <span class="s1">&#39;child2&#39;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">path</span><span class="o">:</span> <span class="s1">&#39;child3&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">component</span>: <span class="kt">Child3Component</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">data</span><span class="o">:</span> <span class="p">{</span> <span class="nx">stepName</span><span class="o">:</span> <span class="s1">&#39;child3&#39;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">];</span></span></span></code></pre></td></tr></table>
</div>
</div></div><h2 id="routernavigate">Router.navigate</h2>
<p>We do not want to edit the url property, because it can lead to complexity. You would just say Angular does have the router to do so. The current route is a chain of activated routes when you are navigating to url like <code>/parent/child1/child2/child3</code>.</p>
<div class="codecontainer" hi="mart"><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="c1">//Inside Some component
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">constructor</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="kr">private</span> <span class="nx">router</span>: <span class="kt">Router</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="kr">private</span> <span class="nx">activatedRoute</span>: <span class="kt">ActivatedRoute</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">navigate() {</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nx">lastChildRoute</span> <span class="o">=</span> <span class="nx">getLastActivatedRouteInChain</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">activatedRoute</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">this</span><span class="p">.</span><span class="nx">router</span><span class="p">.</span><span class="nx">navigate</span><span class="p">([</span><span class="s1">&#39;../child2&#39;</span><span class="p">],</span> <span class="p">{</span> <span class="nx">relativeTo</span>: <span class="kt">lastChildRoute</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div></div><p>To get the activated route for for example <code>child3</code> when the url is <code>/parent/child1/child2/child3</code> we need to get the last child route in the chain. This <code>ActivatedRoute</code> object is passed to the <code>relativeTo</code> property of the <code>router.navigate</code> method.</p>
<div class="codecontainer" hi="mart"><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">export</span> <span class="kr">const</span> <span class="nx">getLastActivatedRouteInChain</span> <span class="o">=</span> <span class="p">(</span><span class="nx">activatedRoute</span>: <span class="kt">ActivatedRoute</span><span class="p">)</span><span class="o">:</span> <span class="nx">ActivatedRoute</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nx">lastRoute</span> <span class="o">=</span> <span class="nx">activatedRoute</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">while</span> <span class="p">(</span><span class="nx">lastRoute</span><span class="p">.</span><span class="nx">firstChild</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">lastRoute</span> <span class="o">=</span> <span class="nx">lastRoute</span><span class="p">.</span><span class="nx">firstChild</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">lastRoute</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span></span></span></code></pre></td></tr></table>
</div>
</div></div><h2 id="conclusion-and-discussion">Conclusion and discussion</h2>
<p>This way we can navigate to a route relative to the current route. This is useful when you have a wizard-like flow in your application.</p>
<h3 id="further-reading">Further reading</h3>
<ul>
<li><a href="https://angular.io/guide/router" target="_blank" rel="noopener">Angular Router</a></li>
</ul>
]]></content:encoded>
      <category>angular</category>
      <category>navigation</category>
      <category>routing</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
