RouterLinkActive for RouterLink with parameters (/dynamic)

半世苍凉 提交于 2019-12-18 14:13:07

问题


RouterLinkActive is not working when using a dynamically generated link when navigating through the app itself.

e.g. in my top navigation i have this;

<a [routerLink]=['user', currentUser.name] routerLinkActive='active'>{{currentUser.name}}</a>

Whilst the hardcoded version would work.

<a [routerLink]=['user','bob']>View Bobs Account</a>

A plunk for this is here; https://plnkr.co/edit/BYKMucE3Y75uJSpV5VWx?p=preview

Click on "John" and "Dynamic Router Link Name = " and "John" should both be active. This sometimes work on the first click, if so, then click back to "Home", the click again on "John", you'll see only the hardcoded link is registered as active, even though the hrefs are identical.

Is this designed/impossible? or am i setting something incorrectly?


回答1:


In your component:

import {Router} from '@angular/router';

isActive(instruction: any[]): boolean {
  // Set the second parameter to true if you want to require an exact match.
  return this.router.isActive(this.router.createUrlTree(instruction), false);
}

In your HTML:

<a [class.active]="isActive(['user', currentUser.name])">

Router.isActive() documentation on angular.io




回答2:


Accepted answer didn't work for me and I just wanted to highlight top level route matches so I used:

isActive(url): boolean {
    return this.router.url.includes(url);
}

and:

[class.active]="isActive('url')"



回答3:


routerLinkActive is evaluated on initial load and only when route is changed. It is no re-evaluated when the link is changed. Hence, dynamically generated link do not work with routerLinkActive. Victor Bredihin's solution above works as the component function is evaluated during rendering.




回答4:


Change your html as below :

<a [routerLink]=['user', currentUser.name] 
  routerLinkActive='active'>
    {{currentUser.name}}
</a>

You can also check Why Angular2 routerLinkActive sets active class to multiple links?




回答5:


I found that the following work-around also works for my code:

<a [routerLink]=['user', currentUser.name]
   [routerLinkActive]='"active dummyclassname-" + currentUser.name'>
   {{currentUser.name}}
</a>

I.e. tricking Angular in revalidating 'routerLinkActive'.



来源:https://stackoverflow.com/questions/39271654/routerlinkactive-for-routerlink-with-parameters-dynamic

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!