RC5 用に更新
現在の URL から開始して URL からルートを取得しようとする代わりに、アクティブ化されたすべてのルート (プライマリ アウトレットに関連付けられている) を から取得できますRouterState
。
ナビゲーション ライフサイクルが成功するたびに、ルータは のツリーを構築しActivatedRoute
ます。これにより、ルータの現在の状態が構成されます。サービスとプロパティRouterState
を使用して、アプリケーションのどこからでもcurrent にアクセスできます。Router
routerState
ルーターの状態は、親、子、および兄弟ルートから必要な情報を取得するために、アクティブ化されたルートからルート ツリーを上下にトラバースするメソッドを提供します。--参照
ルーター イベントをサブスクライブし、各イベントの後、からNavigationEnd
のツリーをたどります。ActivatedRoute
root
import { Component } from '@angular/core';
import { Router, ActivatedRoute, NavigationEnd } from '@angular/router';
import 'rxjs/add/operator/filter';
@Component({
selector: 'breadcrumbs',
template: `
<div>
breadcrumbs:
<span *ngFor="let breadcrumb of breadcrumbs; let last = last">
<a [routerLink]="breadcrumb.url">{{breadcrumb.label}}</a>
<span *ngIf="!last">></span>
</span>
</div>`
})
export class BreadcrumbsComponent {
breadcrumbs: Array<Object>;
constructor(private router:Router, private route:ActivatedRoute) {}
ngOnInit() {
this.router.events
.filter(event => event instanceof NavigationEnd)
.subscribe(event => { // note, we don't use event
this.breadcrumbs = [];
let currentRoute = this.route.root,
url = '';
do {
let childrenRoutes = currentRoute.children;
currentRoute = null;
childrenRoutes.forEach(route => {
if(route.outlet === 'primary') {
let routeSnapshot = route.snapshot;
console.log('snapshot:', routeSnapshot)
url += '/' + routeSnapshot.url.map(segment => segment.path).join('/');
this.breadcrumbs.push({
label: route.snapshot.data.breadcrumb,
url: url });
currentRoute = route;
}
})
} while(currentRoute);
})
}
}
ルートは次のようになります。
{ path: '', component: HomeComponent, data: {breadcrumb: 'home'}}
Plunker- RC.5、ルーター 3.0.0-rc.1
同様のソリューションについては、https://stackoverflow.com/a/38310404/215945も参照してください。