注意: 这里有许多不同的答案,大多数答案都是有效的。事实是,当Angular团队改变其路由器时,有效的改变了很多次。最终将成为Angular中 路由器的Router 3.0版本打破了许多这些解决方案,但它提供了一个非常简单的解决方案。从RC.3开始,首选解决方案是使用[routerLinkActive]
中显示的<router-output>
。
在Angular应用程序中(当我写这篇文章时,目前在2.0.0-beta.0版本中),您如何确定当前活动的路由是什么?
我正在开发一个使用Bootstrap 4的应用,我需要一种方法,当导航链接/按钮的关联组件显示在a
b
b
c
c
c
标记中时,将其标记为有效。
我意识到,当点击其中一个按钮时,我可以自己维护状态,但这并不能涵盖将多条路径放入同一路径的情况(例如主导航菜单以及本地导航菜单)主要组件中的菜单。)
任何建议或链接将不胜感激。感谢。
答案 0 :(得分:293)
使用新的Angular router,您可以为所有链接添加AppWidgetProvider
属性:
[routerLinkActive]="['your-class-name']"
如果只需要一个类,则为简化的非数组格式:
<a [routerLink]="['/home']" [routerLinkActive]="['is-active']">Home</a>
有关详细信息,请参阅poorly documented routerLinkActive
directive。 (我通常通过反复试验来解决这个问题。)
更新:现在可以找到<a [routerLink]="['/home']" [routerLinkActive]="'is-active'">Home</a>
指令的更好文档here。 (感谢@Victor Hugo Arango A.在下面的评论中。)
答案 1 :(得分:65)
我在另一个问题上回答了这个问题,但我相信它也可能与这个问题有关。这是原始答案的链接: Angular 2: How to determine active route with parameters?
我一直在尝试设置活动类,而不必确切知道当前位置(使用路径名称)。到目前为止,我所使用的最佳解决方案是使用Router
类中提供的函数isRouteActive。
router.isRouteActive(instruction): Boolean
接受一个参数,即路由Instruction
对象,并返回true
或false
,无论该指令对于当前路由是否成立。您可以使用Instruction
的{{3}}生成路线Router
。 LinkParams遵循与传递到generate(linkParams: Array)指令的值完全相同的格式(例如router.isRouteActive(router.generate(['/User', { user: user.id }]))
)。
这就是 RouteConfig 看起来像(我已经调整了一下以显示params的用法):
@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>
到目前为止,这是我解决此问题的首选解决方案,它也可能对您有所帮助。
答案 2 :(得分:33)
我解决了在link中遇到的问题,我发现您的问题有一个简单的解决方案。您可以在样式中使用router-link-active
。
@Component({
styles: [`.router-link-active { background-color: red; }`]
})
export class NavComponent {
}
答案 3 :(得分:32)
基于https://github.com/angular/angular/pull/6407#issuecomment-190179875
的@ alex-correia-santos答案的小改进<li>
并像这样使用它:
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));
}
}
答案 4 :(得分:28)
您可以通过将Location
对象注入控制器并检查path()
来检查当前路由,如下所示:
class MyController {
constructor(private location:Location) {}
... location.path(); ...
}
您必须先确保导入它:
import {Location} from "angular2/router";
然后,您可以使用正则表达式与返回的路径进行匹配,以查看哪条路由处于活动状态。请注意,无论您使用哪个Location
,LocationStrategy
类都会返回规范化路径。因此,即使您使用HashLocationStragegy
,返回的路径仍然是/foo/bar
而不是 #/foo/bar
答案 5 :(得分:17)
如何确定当前活动路线是什么?
更新:根据Angular2.4.x更新
constructor(route: ActivatedRoute) {
route.snapshot.params; // active route's params
route.snapshot.data; // active route's resolved data
route.snapshot.component; // active route's component
route.snapshot.queryParams // The query parameters shared by all the routes
}
答案 6 :(得分:9)
标记有效路线routerLinkActive
可以使用
<a [routerLink]="/user" routerLinkActive="some class list">User</a>
这也适用于其他元素,如
<div routerLinkActive="some class list">
<a [routerLink]="/user">User</a>
</div>
如果partial matches也应标记为使用
routerLinkActive="some class list" [routerLinkActiveOptions]="{ exact: false }"
据我所知exact: false
将成为RC.4的默认值
答案 7 :(得分:8)
现在我正在使用rc.4和bootstrap 4,这个对我来说非常适合:
.Rowfilter
这适用于url:/ home
答案 8 :(得分:7)
在2020年,如果要在没有[routerLink]的元素上设置活动类-您可以简单地进行以下操作:
<a
(click)="bookmarks()"
[class.active]="router.isActive('/string/path/'+you+'/need', false)" // <== you need this one. second argument 'false' - exact: true/false
routerLinkActive="active"
[routerLinkActiveOptions]="{ exact: true }"
>
bookmarks
</a>
答案 9 :(得分:6)
Angular2 RC 4的解决方案:
import {containsTree} from '@angular/router/src/url_tree';
import {Router} from '@angular/router';
export function isRouteActive(router: Router, route: string) {
const currentUrlTree = router.parseUrl(router.url);
const routeUrlTree = router.createUrlTree([route]);
return containsTree(currentUrlTree, routeUrlTree, true);
}
答案 10 :(得分:6)
下面是使用RouteData根据当前路线设置menuBar项的样式的方法:
RouteConfig包含带标签的数据(当前路线):
@RouteConfig([
{
path: '/home', name: 'Home', component: HomeComponent,
data: {activeTab: 'home'}, useAsDefault: true
}, {
path: '/jobs', name: 'Jobs', data: {activeTab: 'jobs'},
component: JobsComponent
}
])
一块布局:
<li role="presentation" [ngClass]="{active: isActive('home')}">
<a [routerLink]="['Home']">Home</a>
</li>
<li role="presentation" [ngClass]="{active: isActive('jobs')}">
<a [routerLink]="['Jobs']">Jobs</a>
</li>
类别:
export class MainMenuComponent {
router: Router;
constructor(data: Router) {
this.router = data;
}
isActive(tab): boolean {
if (this.router.currentInstruction && this.router.currentInstruction.component.routeData) {
return tab == this.router.currentInstruction.component.routeData.data['activeTab'];
}
return false;
}
}
答案 11 :(得分:6)
以下是在Angular版本2.0.0-rc.1
中添加活动路由样式的完整示例,其中考虑了空根路径(例如path: '/'
)
app.component.ts - &gt;路由强>
import { Component, OnInit } from '@angular/core';
import { Routes, Router, ROUTER_DIRECTIVES } from '@angular/router';
import { LoginPage, AddCandidatePage } from './export';
import {UserService} from './SERVICES/user.service';
@Component({
moduleId: 'app/',
selector: 'my-app',
templateUrl: 'app.component.html',
styleUrls: ['app.component.css'],
providers: [UserService],
directives: [ROUTER_DIRECTIVES]
})
@Routes([
{ path: '/', component: AddCandidatePage },
{ path: 'Login', component: LoginPage }
])
export class AppComponent { //implements OnInit
constructor(private router: Router){}
routeIsActive(routePath: string) {
let currentRoute = this.router.urlTree.firstChild(this.router.urlTree.root);
// e.g. 'Login' or null if route is '/'
let segment = currentRoute == null ? '/' : currentRoute.segment;
return segment == routePath;
}
}
<强> app.component.html 强>
<ul>
<li [class.active]="routeIsActive('Login')"><a [routerLink]="['Login']" >Login</a></li>
<li [class.active]="routeIsActive('/')"><a [routerLink]="['/']" >AddCandidate</a></li>
</ul>
<route-outlet></router-outlet>
答案 12 :(得分:5)
Router
不再定义isRouteActive
和generate
方法。
urlTree
- 返回当前的url树。
createUrlTree(commands: any[], segment?: RouteSegment)
- 将一组命令应用于当前的url树并创建一个新的url树。
尝试以下
<li
[class.active]=
"router.urlTree.contains(router.createUrlTree(['/SignIn', this.routeSegment]))">
注意,routeSegment : RouteSegment
必须注入组件的构造函数。
答案 13 :(得分:5)
以为我会添加一个不使用任何打字稿的例子:
<input type="hidden" [routerLink]="'home'" routerLinkActive #home="routerLinkActive" />
<section *ngIf="home.isActive"></section>
routerLinkActive
变量绑定到模板变量,然后根据需要重新使用。不幸的是,唯一需要注意的是,<section>
元素无法解决这个问题,因为#home
需要解析之前到解析器<section>
。< / p>
答案 14 :(得分:4)
另一种解决方法。在Angular Router V3 Alpha中更容易。通过注入路由器
import {Router} from "@angular/router";
export class AppComponent{
constructor(private router : Router){}
routeIsActive(routePath: string) {
return this.router.url == routePath;
}
}
使用
<div *ngIf="routeIsActive('/')"> My content </div>
答案 15 :(得分:4)
在Angular2 RC2中,您可以使用这个简单的实现
<a [routerLink]="['/dashboard']" routerLinkActive="active">Dashboard</a>
这会将类active
添加到匹配网址的元素中,详细了解here
答案 16 :(得分:4)
在简单的情况下使用routerLinkActive
很有用,当有链接并且您想要应用某些类时。但是在更复杂的情况下,您可能没有routerLink或者您需要更多东西,您可以创建并使用管道:
@Pipe({
name: "isRouteActive",
pure: false
})
export class IsRouteActivePipe implements PipeTransform {
constructor(private router: Router,
private activatedRoute: ActivatedRoute) {
}
transform(route: any[], options?: { queryParams?: any[], fragment?: any, exact?: boolean }) {
if (!options) options = {};
if (options.exact === undefined) options.exact = true;
const currentUrlTree = this.router.parseUrl(this.router.url);
const urlTree = this.router.createUrlTree(route, {
relativeTo: this.activatedRoute,
queryParams: options.queryParams,
fragment: options.fragment
});
return containsTree(currentUrlTree, urlTree, options.exact);
}
}
然后:
<div *ngIf="['/some-route'] | isRouteActive">...</div>
并且不要忘记在管道依赖项中包含管道;)
答案 17 :(得分:4)
以下是迄今为止发布的Angular 2 RC版本的所有版本的问题的答案:
RC4和RC3 :
将类应用于链接的链接或祖先:
<li routerLinkActive="active"><a [routerLink]="['/home']">Home</a></li>
/ home应该是URL而不是路由名称,因为自路由器v3起,Route对象上不再存在name属性。
有关此link的routerLinkActive指令的更多信息。
根据当前路线将类应用于任何div:
e.g
<nav [class.transparent]="router.url==('/home')">
</nav>
RC2和RC1 :
使用router.isRouteActive和class。*的组合。例如,根据Home Route应用活动类。
名称和网址都可以传递到router.generate。
<li [class.active]="router.isRouteActive(router.generate(['Home']))">
<a [routerLink]="['Home']" >Home</a>
</li>
答案 18 :(得分:4)
对于Angular版本4+,您不需要使用任何复杂的解决方案。您只需使用[routerLinkActive]="'is-active'"
。
有关bootstrap 4导航链接的示例:
<ul class="navbar-nav mr-auto">
<li class="nav-item" routerLinkActive="active">
<a class="nav-link" routerLink="/home">Home</a>
</li>
<li class="nav-item" routerLinkActive="active">
<a class="nav-link" routerLink="/about-us">About Us</a>
</li>
<li class="nav-item" routerLinkActive="active">
<a class="nav-link " routerLink="/contact-us">Contact</a>
</li>
</ul>
答案 19 :(得分:3)
Router类的实例实际上是一个Observable,它每次更改时都会返回当前路径。我就是这样做的:
export class AppComponent implements OnInit {
currentUrl : string;
constructor(private _router : Router){
this.currentUrl = ''
}
ngOnInit() {
this._router.subscribe(
currentUrl => this.currentUrl = currentUrl,
error => console.log(error)
);
}
isCurrentRoute(route : string) : boolean {
return this.currentUrl === route;
}
}
然后在我的HTML中:
<a [routerLink]="['Contact']" class="item" [class.active]="isCurrentRoute('contact')">Contact</a>
答案 20 :(得分:3)
如接受答案的一条评论中所述,routerLinkActive
指令也可以应用于实际<a>
标记的容器。
例如使用Twitter引导程序选项卡,其中活动类应该应用于包含该链接的<li>
标记:
<ul class="nav nav-tabs">
<li role="presentation" routerLinkActive="active">
<a routerLink="./location">Location</a>
</li>
<li role="presentation" routerLinkActive="active">
<a routerLink="./execution">Execution</a>
</li>
</ul>
非常整洁!我想该指令会检查标记的内容,并查找带有<a>
指令的routerLink
标记。
答案 21 :(得分:1)
假设您要将CSS添加到我的活动状态/选项卡。使用 routerLinkActive 激活路由链接。
注意:'有效'是我的班级名称
<style>
.active{
color:blue;
}
</style>
<a routerLink="/home" [routerLinkActive]="['active']">Home</a>
<a routerLink="/about" [routerLinkActive]="['active']">About</a>
<a routerLink="/contact" [routerLinkActive]="['active']">Contact</a>
答案 22 :(得分:1)
一种编程方式是在组件本身中执行此操作。我在这个问题上苦苦挣扎了三个星期,但放弃了有角度的文档,而是阅读了使routerlinkactive正常工作的实际代码,这就是我能找到的最佳文档。
import {
Component,AfterContentInit,OnDestroy, ViewChild,OnInit, ViewChildren, AfterViewInit, ElementRef, Renderer2, QueryList,NgZone,ApplicationRef
}
from '@angular/core';
import { Location } from '@angular/common';
import { Subscription } from 'rxjs';
import {
ActivatedRoute,ResolveStart,Event, Router,RouterEvent, NavigationEnd, UrlSegment
} from '@angular/router';
import { Observable } from "rxjs";
import * as $ from 'jquery';
import { pairwise, map } from 'rxjs/operators';
import { filter } from 'rxjs/operators';
import {PageHandleService} from '../pageHandling.service'
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.scss']
})
export class HeaderComponent implements AfterContentInit,AfterViewInit,OnInit,OnDestroy{
public previousUrl: any;
private subscription: Subscription;
@ViewChild("superclass", { static: false } as any) superclass: ElementRef;
@ViewChildren("megaclass") megaclass: QueryList<ElementRef>;
constructor( private element: ElementRef, private renderer: Renderer2, private router: Router, private activatedRoute: ActivatedRoute, private location: Location, private pageHandleService: PageHandleService){
this.subscription = router.events.subscribe((s: Event) => {
if (s instanceof NavigationEnd) {
this.update();
}
});
}
ngOnInit(){
}
ngAfterViewInit() {
}
ngAfterContentInit(){
}
private update(): void {
if (!this.router.navigated || !this.superclass) return;
Promise.resolve().then(() => {
this.previousUrl = this.router.url
this.megaclass.toArray().forEach( (superclass) => {
var superclass = superclass
console.log( superclass.nativeElement.children[0].classList )
console.log( superclass.nativeElement.children )
if (this.previousUrl == superclass.nativeElement.getAttribute("routerLink")) {
this.renderer.addClass(superclass.nativeElement.children[0], "box")
console.log("add class")
} else {
this.renderer.removeClass(superclass.nativeElement.children[0], "box")
console.log("remove class")
}
});
})
//update is done
}
ngOnDestroy(): void { this.subscription.unsubscribe(); }
//class is done
}
注意:
对于编程方式,请确保添加路由器链接,并且它需要一个子元素。如果要更改此设置,则需要摆脱superclass.nativeElement
上的孩子。
答案 23 :(得分:1)
我正在寻找一种方法来使用带有Angular2的Twitter Bootstrap样式导航,但无法将active
类应用于所选链接的父元素。发现@ alex-correia-santos的解决方案完美无缺!
包含选项卡的组件必须先导入路由器并在其构造函数中定义它,然后才能进行必要的调用。
这是我的实施的简化版本......
import {Component} from 'angular2/core';
import {Router, RouteConfig, ROUTER_DIRECTIVES} from 'angular2/router';
import {HomeComponent} from './home.component';
import {LoginComponent} from './login.component';
import {FeedComponent} from './feed.component';
@Component({
selector: 'my-app',
template: `
<ul class="nav nav-tabs">
<li [class.active]="_r.isRouteActive(_r.generate(['Home']))">
<a [routerLink]="['Home']">Home</a>
</li>
<li [class.active]="_r.isRouteActive(_r.generate(['Login']))">
<a [routerLink]="['Login']">Sign In</a>
</li>
<li [class.active]="_r.isRouteActive(_r.generate(['Feed']))">
<a [routerLink]="['Feed']">Feed</a>
</li>
</ul>`,
styleUrls: ['app/app.component.css'],
directives: [ROUTER_DIRECTIVES]
})
@RouteConfig([
{ path:'/', component:HomeComponent, name:'Home', useAsDefault:true },
{ path:'/login', component:LoginComponent, name:'Login' },
{ path:'/feed', component:FeedComponent, name:'Feed' }
])
export class AppComponent {
title = 'My App';
constructor( private _r:Router ){}
}
答案 24 :(得分:1)
angular 5用户的简单解决方案是,只需将routerLinkActive
添加到列表项。
routerLinkActive
指令通过routerLink
指令与路径相关联。
它将一个类数组作为输入,如果它的路由当前处于活动状态,它将添加到它所附加的元素,如下所示:
<li class="nav-item"
[routerLinkActive]="['active']">
<a class="nav-link"
[routerLink]="['home']">Home
</a>
</li>
如果我们当前正在查看本地路由,则上面将为锚标记添加一个活动类。
答案 25 :(得分:0)
纯html模板就像
function loadModal(){
var divid = $(this).closest(".forumItem").attr("id");
console.log(divid);
}
答案 26 :(得分:0)
从在.ts中导入RouterLinkActive开始
从'@ angular / router'导入{RouterLinkActive};
现在在HTML中使用RouterLinkActive
<p>I am fine and <input type="checkbox" id="show-more"> <span>how are you?</span><label for="show-more"> details</label></p>
为类“ class_Name”提供一些CSS,因为当该链接被激活/单击时,您会在检查时发现该类。
答案 27 :(得分:0)
从Angular 8开始,此方法有效:
<li routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }">
<a [routerLink]="['/']">Home</a>
</li>
{ exact: true }
确保与网址匹配。
答案 28 :(得分:0)
在最新版本的angular中,您只需检查router.isActive(routeNameAsString)
。例如,请参见下面的示例:
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item" [class.active] = "router.isActive('/dashboard')">
<a class="nav-link" href="#">داشبورد <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item" [class.active] = "router.isActive(route.path)" *ngFor="let route of (routes$ | async)">
<a class="nav-link" href="javascript:void(0)" *ngIf="route.childRoutes && route.childRoutes.length > 0"
[matMenuTriggerFor]="menu">{{route.name}}</a>
<a class="nav-link" href="{{route.path}}"
*ngIf="!route.childRoutes || route.childRoutes.length === 0">{{route.name}}</a>
<mat-menu #menu="matMenu">
<span *ngIf="route.childRoutes && route.childRoutes.length > 0">
<a *ngFor="let child of route.childRoutes" class="nav-link" href="{{route.path + child.path}}"
mat-menu-item>{{child.name}}</a>
</span>
</mat-menu>
</li>
</ul>
<span class="navbar-text mr-auto">
<small>سلام</small> {{ (currentUser$ | async) ? (currentUser$ | async).firstName : 'کاربر' }}
{{ (currentUser$ | async) ? (currentUser$ | async).lastName : 'میهمان' }}
</span>
</div>
并确保您不会忘记在组件中注入路由器。
答案 29 :(得分:0)
我正在使用角度路由器^3.4.7
,我仍然遇到routerLinkActive
指令的问题。
如果您有多个具有相同网址的链接,并且它似乎不会一直刷新,则无效。
受到@tomaszbak答案的启发,我创建了一个little component来完成这项工作
答案 30 :(得分:0)
这对我的活动/非活动路线有帮助:
<a routerLink="/user/bob" routerLinkActive #rla="routerLinkActive" [ngClass]="rla.isActive ? 'classIfActive' : 'classIfNotActive'">
</a>