【发布时间】:2019-09-18 05:28:55
【问题描述】:
我正在尝试在我的个人项目(Angular 7)中实现面包屑。但我无法按预期实施。我找到了很多实现,但没有一个对我有用。
我输入 URL 时的要求:http://localhost:4200/personal-projects/2/backlog 是
个人项目 > 2 > 待办事项
但我得到的输出是:
2 > Backlog
谁能帮我实现逻辑以获得预期的输出? 我的路由模型如下:
const routes: Routes = [
{
path: '',
redirectTo: 'dashboard',
pathMatch: 'full'
},
{
path: '',
component: HomeDashboardComponent,
children: [
{
path: 'dashboard',
component: DashComponent,
data: {
breadcrumb: 'Dashboard'
}
},
{
path: 'personal-projects',
component: PresonalProjectsComponent,
data: {
breadcrumb: 'Personal Project'
}
}
]
},
{
path: 'personal-projects/:projectId',
component: ProjectDetailsComponent,
data: {
breadcrumb: ''
},
children: [
{
path: '',
redirectTo: 'backlog',
pathMatch: 'full'
},
{
path: 'sprint',
component: SprintComponent,
data: {
breadcrumb: 'Sprint'
}
},
{
path: 'backlog',
component: BacklogComponent,
data: {
breadcrumb: 'backlog'
}
}
]
}
];
breadcrumb.component.ts 文件为:
public breadcrumbs: IBreadCrumb[];
constructor(
private router: Router,
private activatedRoute: ActivatedRoute,
) {
this.breadcrumbs = this.buildBreadCrumb(this.activatedRoute.root);
}
ngOnInit() {
this.router.events.pipe(
filter((event) => event instanceof NavigationEnd),
distinctUntilChanged(),
).subscribe(() => {
this.breadcrumbs = this.buildBreadCrumb(this.activatedRoute.root);
});
}
/**
* Recursively build breadcrumb according to activated route.
* @param route
* @param url
* @param breadcrumbs
*/
buildBreadCrumb(route: ActivatedRoute, url: string = '', breadcrumbs: IBreadCrumb[] = []): IBreadCrumb[] {
// If no routeConfig is avalailable we are on the root path
let label = route.routeConfig && route.routeConfig.data ? route.routeConfig.data.breadcrumb : '';
let isClickable = route.routeConfig && route.routeConfig.data && route.routeConfig.data.isClickable;
let path = route.routeConfig && route.routeConfig.data ? route.routeConfig.path : '';
// If the route is dynamic route such as ':id', remove it
const lastRoutePart = path.split('/').pop();
const isDynamicRoute = lastRoutePart.startsWith(':');
if (isDynamicRoute && !!route.snapshot) {
const paramName = lastRoutePart.split(':')[1];
path = path.replace(lastRoutePart, route.snapshot.params[paramName]);
label = route.snapshot.params[paramName];
}
// In the routeConfig the complete path is not available,
// so we rebuild it each time
const nextUrl = path ? `${url}/${path}` : url;
const breadcrumb: IBreadCrumb = {
label: label,
url: nextUrl,
};
// Only adding route with non-empty label
const newBreadcrumbs = breadcrumb.label ? [...breadcrumbs, breadcrumb] : [...breadcrumbs];
if (route.firstChild) {
// If we are not on our current path yet,
// there will be more children to look after, to build our breadcumb
return this.buildBreadCrumb(route.firstChild, nextUrl, newBreadcrumbs);
}
return newBreadcrumbs;
}
}
【问题讨论】:
标签: angular breadcrumbs