Angular에서 활성 경로를 어떻게 결정합니까?


312

참고 : 여기에는 여러 가지 답변이 있으며 대부분 한 번에 유효합니다. 사실 Angular 팀이 라우터를 변경함에 따라 작동하는 내용이 여러 번 변경되었습니다. 결국 Angular 에서 라우터 가 될 Router 3.0 버전 은 이러한 솔루션 중 많은 부분을 손상 시키지만 자체적으로 매우 간단한 솔루션을 제공합니다. RC.3부터 선호되는 솔루션은 이 답변에[routerLinkActive] 표시된대로 사용 하는 입니다.

Angular 응용 프로그램 (이 글을 쓸 때 2.0.0-beta.0 릴리스에서 현재)에서 현재 활성 경로가 무엇인지 어떻게 결정합니까?

Bootstrap 4를 사용하는 앱을 개발 중이며 관련 구성 요소가 <router-output>태그 에 표시 될 때 탐색 링크 / 버튼을 활성으로 표시하는 방법이 필요합니다 .

버튼 중 하나를 클릭하면 상태를 직접 유지할 수 있지만 동일한 경로에 여러 경로가있는 경우 (주 탐색 메뉴 및 주 구성 요소의 로컬 메뉴와 같은 경우)에는 적용되지 않습니다. ).

어떤 제안이나 링크를 부탁드립니다. 감사.

답변:


355

새로운 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.에게 감사드립니다.)


4
경로의 자식이 활성화 될 때 활성화 할 수있는 방법이 있습니까? 이 코드에는 @inputfor 옵션이 있지만 exact: false현재 경로의 형제가 활성화 될 때마다 클래스를 활성화합니다.
Matej 2016 년

1
@ GabrieleB-David 나는 그것을 테스트하지는 않았지만 router.navigate()잘 작동 한다고 가정 합니다. routerLinkActive이 링크가 활성 경로를 나타내는 지 여부를 나타냅니다.
jessepinho

7
주어진 예에서 [routerLinkActive]는 <a /> 태그에 추가되지만 클래스가 다른 곳에 필요한 경우 다른 요소에 배치 할 수도 있습니다. <ul> <li [routerLinkActive] = "[ 'active']"> <a [routerLink]="[myRoute.Route]">
Oblivion2000

2
@jessepinho-시도-[routerLinkActive] = " 'active'"는 a-tag에 [routerLink]가있는 경우에만 작동합니다. [routerLink] 대신 (click) = "navitageTo ( '/ route')"가 있고 해당 함수에서 this.router.navigate (route)를 호출하면 새 구성 요소가로드되지만 활성 CSS 클래스는 ' 적용되지 않습니다. this.router.navigate (..) 이외의 다른 기능을 시도하고 있습니다.
미카엘 카루소


69

나는 다른 질문에 이것을 대답했지만 이것과도 관련이 있다고 생각합니다. 다음은 원래 답변에 대한 링크입니다. Angular 2 : 매개 변수로 활성 경로를 결정하는 방법?

현재 위치가 무엇인지 정확히 알 필요없이 활성 경로 를 설정하려고했습니다 (경로 이름 사용) . 지금까지 내가 얻은 최고의 솔루션 은 클래스 에서 사용 가능한 isRouteActive 함수를 사용하는 것 Router입니다.

router.isRouteActive(instruction): Boolean경로입니다 하나 개의 매개 변수 소요 Instruction객체 반환 true또는 false현재의 경로에 대한 그 명령이 참 보유 여부를. 의 generate (linkParams : Array)Instruction 를 사용하여 경로 를 생성 할 수 있습니다 . LinkParams는 routerLink 지시문에 전달 된 값과 정확히 같은 형식을 따릅니다 (예 :) .Routerrouter.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>

이것은 지금까지 문제에 대한 선호되는 해결책이었습니다.도 도움이 될 수 있습니다.


1
이 솔루션은 경로와 일치하는 정규 표현식 대신 Angular API를 사용하기 때문에 허용되는 솔루션보다 낫습니다. 그래도 여전히 추악하지만, 할 수 있으면 좋을 것 router.isRouteActive('Home')입니다.
Philip

2
솔루션을 구현하려고 할 때 몇 가지 문제에 직면하여 일부는 유용 할 수 있습니다. stackoverflow.com/questions/35882998/…
Nikita Vlasenko

5
Router클래스 생성자를 잊지 말아야합니다
Nikita Vlasenko

2
최신 Angular 2 버전 에서는 라우터 구성 객체 name대신 사용 했습니다 as.
ComFreek

9
이것은 대신 rc1에서 사용될 수 있습니다 :router.urlTree.contains(router.createUrlTree(['Home']))
František Žiačik

35

링크 에서 발생한 문제를 해결했으며 귀하의 질문에 대한 간단한 해결책이 있음을 알게되었습니다. router-link-active대신 스타일을 사용할 수 있습니다 .

@Component({
   styles: [`.router-link-active { background-color: red; }`]
})
export class NavComponent {
}

2
나는 이것이 받아 들여야 할 답변이라고 생각합니다. Angular2의 라우터가 자동으로 추가합니다.
Gabu

2
불행히도 그 클래스는 <li>가 아니라 <a>에 추가됩니다.
laifjei

불행히도 실제로 잘 작동하지 않습니다. 동적으로 생성 된 메뉴가 하나 있으며 router-link-active클래스가 활성 a또는 에 추가되지 않았습니다 li. 하지만 부트 스트랩을 사용하는 한 곳이 있으며 거기에서 nav-tabs작동합니다.
Shri

33

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 작동
Pratik Kelwalkar

훌륭한 솔루션으로 라우터를 비공개로 만들 수 있습니다.
Kelvin Dealca

이것은 훨씬 더 나은 솔루션이며 생성자를 만들고 라우터를 전달하는 것과 같은 작은 것을 잊어 버리는 멍청한 놈에게 특히 유용합니다! 당신은 수표를받을 자격이 있습니다.
Methodianian

30

Location객체를 컨트롤러 에 주입하고을 확인하여 현재 경로를 확인할 수 있습니다 path().

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

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

먼저 가져와야합니다.

import {Location} from "angular2/router";

그런 다음 정규식을 사용하여 반환 된 경로와 일치하여 활성화 된 경로를 확인할 수 있습니다. 점을 유의 Location클래스가 어떤 관계없이 표준화 된 경로를 반환 LocationStrategy당신이 사용하고 있습니다. 따라서 HashLocationStragegy경로를 사용하더라도 반환 된 경로는 여전히 형식이 /foo/bar 아닙니다 #/foo/bar


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
}

더보기...


14

활성 경로를 표시 routerLinkActive하는 데 사용할 수 있습니다

<a [routerLink]="/user" routerLinkActive="some class list">User</a>

이것은 또한 다음과 같은 다른 요소에서도 작동합니다.

<div routerLinkActive="some class list">
  <a [routerLink]="/user">User</a>
</div>

경우 부분 일치는 또한 사용을 표시해야

routerLinkActive="some class list" [routerLinkActiveOptions]="{ exact: false }"

내가 아는 exact: false한 RC.4에서 기본값이 될 것입니다.


11

지금은 부트 스트랩 4와 함께 rc.4를 사용하고 있으며 이것은 나에게 완벽하게 작동합니다.

 <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact:
true}">
    <a class="nav-link" [routerLink]="['']">Home</a>
</li>

이것은 URL에서 작동합니다 : / home


정확한 옵션의 목적은 무엇입니까? 그렇게하면 하위 경로와 일치하지 /home/whatever않습니까?
Michael Oryl

예, exact해당 경로의 이름은 동일합니다. 그리고 트위터 부트 스트랩과 같은 도구와 함께 사용하려는 경우에 필요합니다. 이미 활성 링크 상태를 처리하며 exact옵션이 없으면 작동하지 않습니다. (핵심에서 어떻게 작동하는지 잘 모르겠습니다. 시험해 보았습니다.)
Artem Zinoviev

7

다음은 현재 경로에 따라 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;
  }
}

7

typescript를 사용하지 않는 예제를 추가하려고 생각했습니다.

<input type="hidden" [routerLink]="'home'" routerLinkActive #home="routerLinkActive" />
<section *ngIf="home.isActive"></section>

routerLinkActive변수 템플릿 변수에 결합 된 후, 필요에 따라 사용되는 재. 불행히도 유일한 경고는 파서가 치기 전에 해결해야 할 때이 <section>요소를 모두 가질 수 없다는 것 입니다.#home<section>


@ angular / router 또는 작동하지 않는 활성 경로에 조건을 적용하기위한 완벽한 솔루션.
Rohit Parte

와우, 정말 도움이됩니다. 감사!
Yulian

6

RouterAngular 2 RC에서는 더 이상 정의 isRouteActivegenerate방법이 없습니다 .

urlTree -현재 URL 트리를 반환합니다.

createUrlTree(commands: any[], segment?: RouteSegment) -현재 URL 트리에 명령 배열을 적용하고 새 URL 트리를 만듭니다.

다음을 시도하십시오

<li 
[class.active]=
"router.urlTree.contains(router.createUrlTree(['/SignIn', this.routeSegment]))">

통지는, routeSegment : RouteSegment구성 요소의 생성자에 주입해야합니다.


6

여기에 각도 버전의 활성 경로 스타일을 추가하는 완벽한 예입니다 2.0.0-rc.1(예를 들어, 계정 널 루트 경로로 소요 path: '/')

app.component.ts-> 경로

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>

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);
}

5

Angular 8부터는 다음과 같이 작동합니다.

<li routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }">
    <a [routerLink]="['/']">Home</a>
</li>

{ exact: true } URL과 일치하는지 확인하십시오.


5

[routerLink]가없는 요소에 활성 클래스를 설정하려면 2020 년에 간단하게 수행 할 수 있습니다.

<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>

고마워, 이고르 이것이 가장 좋은 해결책입니다.
Dmitry Grinko

의견 주셔서 감사합니다 :)
Kurkov Igor

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>

가져 오면 null 오류의 'isSkipSelf'속성을 읽을 수 없습니다. 어떤 아이디어?
atsituab 2016 년

4

Angular2 RC2에서는이 간단한 구현을 사용할 수 있습니다

<a [routerLink]="['/dashboard']" routerLinkActive="active">Dashboard</a>

activeURL이 일치하는 요소 에 클래스 를 추가 합니다. 자세한 내용은 여기를 참조하십시오.


4

다음은 현재까지 릴리스 된 모든 버전의 Angular 2 RC 버전에 대한이 질문에 대한 답변입니다.

RC4 및 RC3 :

링크 또는 링크의 조상에 클래스를 적용하는 경우 :

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

라우터 속성 v3에서 이름 속성이 더 이상 Route 개체에 존재하지 않으므로 / home은 경로 이름이 아닌 URL이어야합니다.

링크의 routerLinkActive 지시문에 대한 추가 정보 .

현재 경로를 기반으로 모든 div에 클래스를 적용하려면 :

  • 구성 요소 생성자에 라우터를 삽입하십시오.
  • 비교할 사용자 router.url.

예 :

<nav [class.transparent]="router.url==('/home')">
</nav>

RC2 및 RC1 :

router.isRouteActive와 class. *의 조합을 사용하십시오. 예를 들어, 홈 루트를 기반으로 액티브 클래스를 적용합니다.

이름과 URL은 router.generate로 전달 될 수 있습니다.

 <li [class.active]="router.isRouteActive(router.generate(['Home']))">
    <a [routerLink]="['Home']" >Home</a>
</li>

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>

파이프 의존성에 파이프를 포함시키는 것을 잊지 마십시오.)


좋은 생각이지만 angular2.0.0rc3에서 this.router.isRouteActive ...를 this._location.path ()로 변경하고 맨 위에 넣으십시오. import {Location} from '@ angular / common';
Kamil Kiełczewski 2016 년

2
코드에서 누락 된 것 같습니다. 어디에 containsTree정의되어 있습니까?
Øystein Amundsen

4

Angular 버전 4+의 경우 복잡한 솔루션을 사용할 필요가 없습니다. 간단하게 사용할 수 있습니다 [routerLinkActive]="'is-active'".

부트 스트랩 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>

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>

1
라우터 인스턴스에서 .subscribe를 사용할 수 없습니다.
Shivang Gupta

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지시를.


2

앵귤러 5 사용자를위한 간단한 솔루션 routerLinkActive은 목록 항목에 추가 하는 것입니다.

routerLinkActive지침은 통해 경로와 관련된 routerLink지시어.

라우트가 현재 활성 상태 인 경우 첨부 된 요소에 추가 할 클래스 배열을 입력으로 사용합니다.

<li class="nav-item"
    [routerLinkActive]="['active']">
  <a class="nav-link"
     [routerLink]="['home']">Home
  </a>
</li>

위는 홈 경로를보고있는 경우 앵커 클래스에 활성 클래스를 추가합니다.

데모


2

그리고 최신 버전의 각도에서는 간단히 확인할 수 있습니다 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>

또한 구성 요소에 라우터를 주입하는 것을 잊지 마십시오.


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 ){}
}

1

활성 상태 / 탭에 CSS를 추가한다고 가정 해 봅시다. 사용 routerLinkActive는 라우팅 링크를 활성화합니다.

참고 : 'active'는 여기 내 수업 이름입니다.

<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>

0

각도 라우터를 사용 ^3.4.7하고 있는데 routerLinkActive지시문에 여전히 문제가 있습니다.

동일한 URL을 가진 여러 개의 링크가 있고 항상 새로 고침되지 않는 경우 작동하지 않습니다.

@tomaszbak 답변에서 영감을 얻어 작업을 수행 하는 작은 구성 요소 를 만들었습니다.


0

순수한 HTML 템플릿

 <a [routerLink]="['/home']" routerLinkActive="active">Home</a>
 <a [routerLink]="['/about']" routerLinkActive="active">About us</a>
 <a [routerLink]="['/contact']" routerLinkActive="active">Contacts</a>

0

.ts에서 RouterLinkActive 가져 오기로 시작하십시오.

'@ angular / router'에서 {RouterLinkActive} 가져 오기;

이제 HTML에서 RouterLinkActive를 사용하십시오.

<span class="" routerLink ="/some_path" routerLinkActive="class_Name">Value</span></a>

이 링크가 활성화 / 클릭 될 때 검사하는 동안이 클래스를 찾을 수 있으므로 "class_Name"클래스에 CSS를 제공하십시오.


0

프로그래밍 방식은 구성 요소 자체에서 수행하는 것입니다. 나는이 문제에 대해 3 주 동안 고생했지만 각도 문서를 포기하고 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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.