نمایش Breadcrumbs در برنامههای Angular
نویسنده: وحید نصیری
تاریخ: ۱۳۹۶/۱۱/۰۹ ۱۵:۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
ng g c core/bread-crumb
import { BreadCrumbComponent } from "./bread-crumb/bread-crumb.component";
@NgModule({
imports: [CommonModule, RouterModule],
exports: [
// components that are used in app.component.ts will be listed here.
BreadCrumbComponent
],
declarations: [
// components that are used in app.component.ts will be listed here.
BreadCrumbComponent
]
})
export class CoreModule {} export interface BreadCrumb {
label: string;
url: string;
}; import { Component, OnInit, ViewEncapsulation } from "@angular/core";
import { ActivatedRoute, NavigationEnd, Router } from "@angular/router";
import { BreadCrumb } from "./bread-crumb";
import { Observable } from "rxjs/Observable";
@Component({
selector: "app-bread-crumb",
templateUrl: "./bread-crumb.component.html",
styleUrls: ["./bread-crumb.component.css"],
encapsulation: ViewEncapsulation.None
})
export class BreadCrumbComponent implements OnInit {
breadcrumbs$: Observable<BreadCrumb[]>;
constructor(private activatedRoute: ActivatedRoute, private router: Router) { }
ngOnInit() {
this.breadcrumbs$ = this.router.events
.filter(event => event instanceof NavigationEnd)
.distinctUntilChanged()
.map(event => event ? this.buildBreadCrumbs(this.activatedRoute.root) : []);
}
buildBreadCrumbs(route: ActivatedRoute, url: string = "", breadcrumbs: Array<BreadCrumb> = []): Array<BreadCrumb> {
const routeDataBreadCrumbKey = "breadcrumb";
const routeConfig = route.routeConfig;
const path = routeConfig && routeConfig.path !== undefined ? routeConfig.path : "";
let label = path;
if (url === "") {
label = "Home";
} else if (routeConfig && routeConfig.data !== undefined) {
label = routeConfig.data[routeDataBreadCrumbKey];
}
const nextUrl = `${url}${path}/`;
const breadcrumb: BreadCrumb = {
label: label,
url: nextUrl
};
console.log("breadcrumb", { path: path, label: label, url: nextUrl, route: route });
const newBreadcrumbs = [...breadcrumbs, breadcrumb];
if (route.firstChild) {
return this.buildBreadCrumbs(route.firstChild, nextUrl, newBreadcrumbs);
}
return newBreadcrumbs;
}
} ngOnInit() {
this.breadcrumbs$ = this.router.events
.filter(event => event instanceof NavigationEnd)
.distinctUntilChanged()
.map(event => event ? this.buildBreadCrumbs(this.activatedRoute.root) : []);
} const routes: Routes = [
{
path: "breadCrumbTest",
data: { breadcrumb: "Parent1" },
children: [
{
path: "", component: Parent1Component
},
{
path: "Parent1Child1",
data: { breadcrumb: "Parent1-Child1" },
children: [
{
path: "", component: Parent1Child1Component
},
{
path: "Parent1Child1Child1", component: Parent1Child1Child1Component,
data: { breadcrumb: "Parent1-Child1 Child1" }
}
]
}
]
}
]; data: { breadcrumb: "Parent1-Child1 Child1" } buildBreadCrumbs(route: ActivatedRoute, url: string = "", breadcrumbs: Array<BreadCrumb> = []): Array<BreadCrumb> {
const routeDataBreadCrumbKey = "breadcrumb";
const routeConfig = route.routeConfig;
const path = routeConfig && routeConfig.path !== undefined ? routeConfig.path : "";
let label = path;
if (url === "") {
label = "Home";
} else if (routeConfig && routeConfig.data !== undefined) {
label = routeConfig.data[routeDataBreadCrumbKey];
} const nextUrl = `${url}${path}/`;
const breadcrumb: BreadCrumb = {
label: label,
url: nextUrl
}; const newBreadcrumbs = [...breadcrumbs, breadcrumb];
if (route.firstChild) {
return this.buildBreadCrumbs(route.firstChild, nextUrl, newBreadcrumbs);
}
return newBreadcrumbs; encapsulation: ViewEncapsulation.None
<ol class="breadcrumb">
<li *ngFor="let breadcrumb of breadcrumbs$ | async" class="breadcrumb-item">
<a [routerLink]="[breadcrumb.url]">{{ breadcrumb.label }}</a>
</li>
</ol> breadcrumbs$: Observable<BreadCrumb[]>;
<div class="container"> <app-bread-crumb></app-bread-crumb> <router-outlet></router-outlet> </div>
export interface BreadCrumb {
label: string;
url?: string;
glyphIcon?: string;
}; data: { breadcrumb: { label: "Parent1", glyphIcon: "glyphicon glyphicon-link" } as BreadCrumb },