在 Angular 中,您如何确定活动路线?

IT技术 javascript typescript angular angular2-routing
2021-01-21 04:34:38

注意: 这里有许多不同的答案,而且大多数都曾经有效。事实是,随着 Angular 团队更改其路由器,有效的方法发生了多次变化。最终将成为Angular 中路由器的 Router 3.0 版本打破了许多这些解决方案,但提供了一个非常简单的解决方案。从 RC.3 开始,首选解决方案是使用本答案中[routerLinkActive]所示的方法

在一个 Angular 应用程序中(在我写这篇文章时是 2.0.0-beta.0 版本中的当前版本),你如何确定当前活动的路由是什么?

我正在开发一个使用 Bootstrap 4 的应用程序,当导航链接/按钮显示在<router-output>标签中时,我需要一种将导航链接/按钮标记为活动的方法

我意识到我可以在单击其中一个按钮时自己保持状态,但这不会涵盖将多个路径进入同一路线的情况(比如主导航菜单以及主组件中的本地菜单) )。

任何建议或链接将不胜感激。谢谢。

6个回答

使用新的Angular 路由器,您可以[routerLinkActive]="['your-class-name']"为所有链接添加一个属性:

<a [routerLink]="['/home']" [routerLinkActive]="['is-active']">Home</a>

如果只需要一个类,或者简化的非数组格式:

<a [routerLink]="['/home']" [routerLinkActive]="'is-active'">Home</a>

如果只需要一个类,或者更简单的格式:

<a [routerLink]="['/home']" routerLinkActive="is-active">Home</a>

有关详细信息,请参阅文档不足的routerLinkActive指令(我主要是通过反复试验来解决这个问题的。)

更新:routerLinkActive现在可以在此处找到指令的更好文档(感谢@Victor Hugo Arango A. 在下面的评论中。)

当路线的孩子处于活动状态时,有没有办法激活它?该代码有一个@inputfor 选项,但exact: false只要当前路由的兄弟节点也处于活动状态,就会激活该类。
2021-03-16 04:34:38
@jessepinho - 尝试过 - [routerLinkActive]="'active'" 仅当您在 a 标签中也有 [routerLink] 时才有效。如果您使用 (click)="navitageTo('/route')" 而不是 [routerLink],并且在该函数中调用了 this.router.navigate(route),则新组件将加载,但您的活动 CSS 类将不会加载不适用。除了 this.router.navigate(..) 之外,我正在尝试在该函数中执行其他操作。
2021-03-16 04:34:38
官方文档中的例子可以帮助你:angular.io/docs/ts/latest/api/router/index/...
2021-03-17 04:34:38
@GabrieleB-David 我还没有测试过,但我认为它router.navigate()会工作得很好。routerLinkActive只是指示此链接是否代表活动路由。
2021-03-31 04:34:38
在给定的示例中,[routerLinkActive] 被添加到 <a /> 标签,但是,如果其他地方需要该类,它也可以放在其他元素上。<ul><li [routerLinkActive]="['active']"><a [routerLink]="[myRoute.Route]">
2021-04-09 04:34:38

我已经在另一个问题中回答了这个问题,但我相信它也可能与这个问题有关。这是原始答案的链接: Angular 2:如何使用参数确定活动路线?

我一直在尝试设置活动类,而不必确切知道当前位置是什么(使用路线名称)到目前为止,我得到的最好的解决方案是使用类中可用的函数isRouteActiveRouter

router.isRouteActive(instruction): Boolean接受一个参数,它是一个路由Instruction对象并返回true或者false该指令是否对当前路由成立。您可以Instruction使用Routergenerate(linkParams: Array)生成路由LinkParams 遵循与传递给routerLink指令(例如router.isRouteActive(router.generate(['/User', { user: user.id }]))的值完全相同的格式

这就是RouteConfig 的样子(我稍微调整了一下以显示参数的用法)

@RouteConfig([
  { path: '/', component: HomePage, name: 'Home' },
  { path: '/signin', component: SignInPage, name: 'SignIn' },
  { path: '/profile/:username/feed', component: FeedPage, name: 'ProfileFeed' },
])

是这样的:

<li [class.active]="router.isRouteActive(router.generate(['/Home']))">
   <a [routerLink]="['/Home']">Home</a>
</li>
<li [class.active]="router.isRouteActive(router.generate(['/SignIn']))">
   <a [routerLink]="['/SignIn']">Sign In</a>
</li>
<li [class.active]="router.isRouteActive(router.generate(['/ProfileFeed', { username: user.username }]))">
    <a [routerLink]="['/ProfileFeed', { username: user.username }]">Feed</a>
</li>

到目前为止,这是我对这个问题的首选解决方案,它可能对您也有帮助。

我在尝试实施该解决方案时遇到了一些问题,所以也许对某些人有用:stackoverflow.com/questions/35882998/...
2021-03-17 04:34:38
这可以在 rc1 中使用: router.urlTree.contains(router.createUrlTree(['Home']))
2021-03-28 04:34:38
不应该忘记放入Router类的构造函数
2021-03-29 04:34:38
我认为这个解决方案比公认的更好,因为它使用 Angular API 而不是匹配路径的正则表达式。尽管如此,它仍然有点丑陋,能够做到这一点就好了router.isRouteActive('Home')
2021-03-30 04:34:38
在最新的 Angular 2 版本中,我使用name而不是as在路由器配置对象中。
2021-04-11 04:34:38

对基于https://github.com/angular/angular/pull/6407#issuecomment-190179875 的@alex-correia-santos 答案的小改进

import {Router, RouteConfig, ROUTER_DIRECTIVES} from 'angular2/router';
// ...
export class App {
  constructor(private router: Router) {
  }

  // ...

  isActive(instruction: any[]): boolean {
    return this.router.isRouteActive(this.router.generate(instruction));
  }
} 

并像这样使用它:

<ul class="nav navbar-nav">
    <li [class.active]="isActive(['Home'])">
        <a [routerLink]="['Home']">Home</a>
    </li>
    <li [class.active]="isActive(['About'])">
        <a [routerLink]="['About']">About</a>
    </li>
</ul>
和组件中的样式styles : [.active { background-color: aliceblue; } ]. +1 它有效
2021-03-25 04:34:38
这些方法在 angular 8 中不存在
2021-03-25 04:34:38
很好的解决方案,这样您就可以将路由器设为私有。
2021-03-26 04:34:38
这是一个更好的解决方案,对于忘记创建构造函数和传入路由器等小事的菜鸟尤其有用!你完全值得接受检查。
2021-04-01 04:34:38

我解决了在此链接中遇到的一个问题,我发现您的问题有一个简单的解决方案。您可以router-link-active在您的样式中使用。

@Component({
   styles: [`.router-link-active { background-color: red; }`]
})
export class NavComponent {
}
不幸的是,该类添加了 <a>,而不是 <li>
2021-03-20 04:34:38
不幸的是,它并不能很好地工作。我有一个动态生成的菜单,并且router-link-active类没有被添加到活动ali. 但有一个地方我正在使用引导程序nav-tabs,它在那里工作。
2021-03-20 04:34:38
我相信这应该是公认的答案。Angular2 的路由器会自动为你添加这个。
2021-04-01 04:34:38

您可以通过将Location对象注入控制器并检查来检查当前路线path(),如下所示:

class MyController {
    constructor(private location:Location) {}

    ...  location.path(); ...
}

您必须确保先导入它:

import {Location} from "angular2/router";

然后,您可以使用正则表达式匹配返回的路径以查看哪个路由处于活动状态。请注意,Location无论LocationStrategy您使用的是哪种路径该类都会返回规范化的路径因此,即使您使用的HashLocationStragegy是返回的路径,它的形式仍然/foo/bar 不是 #/foo/bar