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

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

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

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

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

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



답변

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


답변

나는 다른 질문에 이것을 대답했지만 이것과도 관련이 있다고 생각합니다. 다음은 원래 답변에 대한 링크입니다.
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>

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


답변

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

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


답변

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>


답변

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

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

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

먼저 가져와야합니다.

import {Location} from "angular2/router";

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


답변

현재 활성화 된 경로가 무엇인지 어떻게 알 수 있습니까?

업데이트 : 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
}

더보기…


답변

활성 경로를 표시 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에서 기본값이 될 것입니다.