Ответ 1
Просто проверьте автоопределяемый класс router-link-active
на a
.
Я прочитал этот вопрос о том, как определить активный маршрут, но все же мне непонятно, как определить активный маршрут с параметрами?
Сейчас я делаю так:
<a [routerLink]="['/Profile/Feed', {username: username}]"
[ngClass]="{active: getLinkStyle('/profile/john_doe/feed')}">
Feed for {{username}}
</a>
И внутри моего компонента:
getLinkStyle(path:string):boolean {
console.log(this._location.path()); // logs: '/profile/john_doe/feed'
return this._location.path() === path;
}
И это будет работать, потому что я передаю имя пользователя как строку. Есть ли способ сделать это с передачей правильного параметра
Просто проверьте автоопределяемый класс router-link-active
на a
.
С новым, новым и предстоящим маршрутизатором Angular 2 (при версии 3.0-alpha.7, поскольку я пишу это), это очень простой.
Все, что вам нужно сделать, это использовать директиву [routerLinkActive]
в вашей ссылке.
<a [routerLinkActive]="['active']" [routerLink]="['/contact', contact.id ]">
{{contact.name}}
</a>
Это то, что вы будете использовать, когда Angular 2 будет выпущен для реального времени и больше не будет кандидатом на выпуск. Теперь я использую альфа-маршрутизатор и не имею никаких проблем.
Здесь Plunk демонстрирует его. Вы можете видеть, что ссылки становятся красными, когда вы нажимаете на них. Это директива, присваивающая им класс active
. Конечно, вы можете использовать любое имя класса по вашему выбору.
В Angular 2 rc1 router.isRouteActive
больше не существует.
Я не мог найти какое-либо рабочее решение в любом месте, но я смог решить его так (пользовательский метод isActiveRoute делает трюк):
App.component.ts:
import { Component } from '@angular/core';
import { Routes, Route, Router, ROUTER_DIRECTIVES, ROUTER_PROVIDERS } from '@angular/router';
import { HomeComponent } from './home.component';
import { P1Component } from './p1.component';
@Component({
selector: 'app',
templateUrl: './app/app.template.html',
directives: [ROUTER_DIRECTIVES]
})
@Routes([
{ path: '/', component: HomeComponent },
{ path: '/p1', component: P1Component }
])
export class AppComponent implements OnInit {
constructor(public router: Router){ }
isActiveRoute(route: string) {
return this.router.serializeUrl(this.router.urlTree) == this.router.serializeUrl((this.router.createUrlTree([route])));
}
}
App.template.html:
<ul class="nav navbar-nav">
<li [class.active]="isActiveRoute('/')">
<a class="nav-link" [routerLink]="['/']">Home</a>
</li>
<li [class.active]="isActiveRoute('/p1')">
<a class="nav-link" [routerLink]="['/p1']">Page 1</a>
</li>
Я пытаюсь установить класс active, не зная точно, что такое текущее местоположение (используя имя маршрута). Это лучшее решение, которое я получил до сих пор.
Вот как выглядит RouteConfig (я немного изменил его, чтобы выглядеть так, как вы хотите):
@RouteConfig([
{ path: '/', component: HomePage, as: 'Home' },
{ path: '/signin', component: SignInPage, as: 'SignIn' },
{ path: '/profile/:username/feed', component: FeedPage, as: '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>
Это было мое предпочтительное решение проблемы до сих пор, это может быть полезно и вам.
попробуйте следующее:
<li class="ann_profileimg" [routerLinkActive]="['active']" [routerLink]="['profile']">
<div class="ann_header_menu_left ann_profile_avatar_small"></div>
<span>Vishnu </span>
</li>
Вы можете использовать новую службу определения местоположения из общего пакета Angular2: https://angular.io/docs/js/latest/api/router/Location-class.html#!#path-anchor
import { Location } from '@angular/common';
...
export class YourClass {
constructor(private _loc:Location) {}
getCurrentPath() {
return this._loc.path();
}
}
Примечание. Лучше использовать службу Router для запуска изменений маршрута. использование Расположение только в том случае, если вам нужно взаимодействовать с или создавать нормализованные URL-адреса вне маршрутизации.
Обратите внимание: Документация говорит об импорте из router
, но последняя версия betta, у меня есть Location
услуги в common
.
Для Angular версии 4+ определение активного маршрута в шаблоне довольно просто, поскольку для этой цели существует директива build-in routerLinkActive
, которую вы можете использовать следующим образом:
<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 title="Contact Us" class="nav-link " routerLink="/contact-us">Contact</a>
</li>
</ul>