如何在 Angular 中创建面包屑

问题描述 投票:0回答:1

我想将面包屑添加到我的页面。我有很多路线,但都没有孩子。

我尝试通过创建一个子项来做到这一点,但是到公共页面的重定向太多了。例如;

主页 > 图书馆 > 课程 > 课程名称

分配的课程 > 课程名称

当课程名称的路线相同时,我应该如何子化它们,或者有没有办法不沿着路线子化?

我试着按照路线去做,我期望的结果是;

首页 > 图书馆 > 课程 > 课程名称 分配的课程 > 课程名称

但是当我这样做时,当涉及到课程名称时,它会自动发生这样的情况;

主页 > 图书馆 > 课程 > 课程名称

angular angularjs breadcrumbs
1个回答
0
投票

这是在 Angular 中添加面包屑的简单方法:

  1. 创建面包屑服务:
// breadcrumb.service.ts
import { Injectable } from '@angular/core';
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
import { filter } from 'rxjs/operators';

@Injectable({
  providedIn: 'root',
})
export class BreadcrumbService {
  breadcrumbs: Array<{ label: string, url: string }> = [];

  constructor(private router: Router, private activatedRoute: ActivatedRoute) {
    this.router.events.pipe(
      filter(event => event instanceof NavigationEnd)
    ).subscribe(() => {
      this.breadcrumbs = this.createBreadcrumbs(this.activatedRoute.root);
    });
  }

  private createBreadcrumbs(route: ActivatedRoute, url: string = '', breadcrumbs: Array<{ label: string, url: string }> = []): Array<{ label: string, url: string }> {
    const children: ActivatedRoute[] = route.children;

    if (children.length === 0) {
      return breadcrumbs;
    }

    for (const child of children) {
      const routeURL: string = child.snapshot.url.map(segment => segment.path).join('/');
      if (routeURL !== '') {
        url += `/${routeURL}`;
      }

      breadcrumbs.push({ label: child.snapshot.data['breadcrumb'], url: url });
      return this.createBreadcrumbs(child, url, breadcrumbs);
    }

    return breadcrumbs;
  }
}
  1. 在您的路线中设置面包屑数据:
// app-routing.module.ts
const routes: Routes = [
  {
    path: 'home',
    component: HomeComponent,
    data: { breadcrumb: 'Home' },
  },
  {
    path: 'library',
    component: LibraryComponent,
    data: { breadcrumb: 'Library' },
    children: [
      {
        path: 'lessons',
        component: LessonsComponent,
        data: { breadcrumb: 'Lessons' },
        children: [
          {
            path: ':lessonName',
            component: LessonDetailComponent,
            data: { breadcrumb: 'Lesson Name' },
          },
        ],
      },
      // Other library routes...
    ],
  },
  // Other routes...
];
  1. 在组件中显示面包屑:
// breadcrumb.component.ts
import { Component, OnInit } from '@angular/core';
import { BreadcrumbService } from './breadcrumb.service';

@Component({
  selector: 'app-breadcrumb',
  templateUrl: './breadcrumb.component.html',
  styleUrls: ['./breadcrumb.component.css'],
})
export class BreadcrumbComponent implements OnInit {
  breadcrumbs: Array<{ label: string, url: string }> = [];

  constructor(private breadcrumbService: BreadcrumbService) {}

  ngOnInit(): void {
    this.breadcrumbs = this.breadcrumbService.breadcrumbs;
  }
}
  1. 在布局中使用面包屑组件:
<!-- app.component.html -->
<app-breadcrumb></app-breadcrumb>
<router-outlet></router-outlet>
  1. 创建面包屑模板: 创建一个用于显示面包屑的模板。
<!-- breadcrumb.component.html -->
<nav>
  <ng-container *ngFor="let breadcrumb of breadcrumbs; let last = last">
    <ng-container *ngIf="!last">
      <a [routerLink]="breadcrumb.url">{{ breadcrumb.label }}</a> &gt;
    </ng-container>
    <ng-container *ngIf="last">
      {{ breadcrumb.label }}
    </ng-container>
  </ng-container>
</nav>
© www.soinside.com 2019 - 2024. All rights reserved.