Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why Angular2 routerLinkActive sets active class to multiple links?

I'm trying to implement routerLinkActive to my app but i'm facing the issue that it's sets class active to multiple links. Here's how i'm doing it

<ul class="nav nav-tabs">   <li role="presentation" [routerLinkActive]="['active']"><a [routerLink]="['/']">Home</a></li>   <li role="presentation" [routerLinkActive]="['active']"><a [routerLink]="['/about']">About</a></li>   <li role="presentation" [routerLinkActive]="['active']"><a [routerLink]="['/contact']" >Contact Us</a></li>   </ul> 

Here it's how it looks

enter image description here Here it's how it look in dev-tools enter image description here And my address bar

enter image description here

Am i missing something because i'm doing as explained in angular docs.

like image 475
Jorawar Singh Avatar asked Aug 27 '16 13:08

Jorawar Singh


People also ask

What is the purpose of RouterLinkActive directive?

The RouterLinkActive is a directive for adding or removing classes from an HTML element that is bound to a RouterLink . Using this directive, we can toggle CSS classes for active Router Links based on the current RouterState . The main use case of this directive is to highlight which route is currently active.

How do I set my Router to active links?

Create the header component that contains the navigation links. Then apply the “routerLinkActive” on each router link and provide the CSS class to this property. Here we have created the “active” class in CSS file. Provide the { exact : true } to the root route to avoid multiple active router links.

How does angular determine active routes?

Show activity on this post. You can check the current route by injecting the Location object into your controller and checking the path() , like so: class MyController { constructor(private location:Location) {} ...

What is routerLinkActiveOptions exact true?

With routerLinkActiveOptions you can pass a javascript object {exact:true} to direct Angular to make link active only when exact path matches. With this configuration change 'Home' menu will only be highlighted when it is selected, as soon as you move away from this option it won't remain highlighted anymore.


1 Answers

Try to set [routerLinkActiveOptions]="{exact: true}" to HTML as below :

<ul class="nav nav-tabs">   <li role="presentation" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}"><a [routerLink]="['/']">Home</a></li>   <li role="presentation" routerLinkActive="active"><a [routerLink]="['/about']">About</a></li>   <li role="presentation" routerLinkActive="active"><a [routerLink]="['/contact']" >Contact Us</a></li>   </ul> 

How does it work ?##

RouterLinkActive does chunk the current route and try to match it's parts with the RouterLinks you've provided. With that in mind, route / will be matched anywhere as it's the very parent for all the other routes (like /about, /contact, etc. as it consist of / + route-path). To simplify, it's not a bug, it's sometimes a needed functionality in your application to match multiple routes. To prevent that, you can specify the routerLinkActiveOptions to match exactly the route you're on. That means it's not going to match parent routes but will only try to find the routerLink provided for this exact route.

like image 174
ranakrunal9 Avatar answered Sep 28 '22 13:09

ranakrunal9