如何在 Angular 建立 Breadcrumb (面包屑)

面包屑 为提供网站里的导航,让使用者容易了解当下所在的位置
刚好也呼应前一天使用 router 的部份

现在位置:首页 / 列表 / 内容

了解 router 架构

Angular 里的 router 架构 通常会命名为 app-routing.module.ts

const routes: Routes = [
  {
    path: '',
    children: [
      {
        path: 'about/:name',
        component: AboutComponent,
        data: {
          breadcrumb: '关於',
        },
      },
      {
        path: 'list',
        component: ListComponent,
        data: {
          breadcrumb: '列表',
        },
        children: [
          {
            path: 'detail',
            component: DetailComponent,
            data: {
              breadcrumb: '内容',
            },
          },
        ],
      },
    ],
  },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
})
export class AppRoutingModule {}

如何建立面包屑

监听路由事件

这里会需要带点 rxjs 的概念


breadcrumbs$: Observable<any>;

constructor(
  private router: Router,
  private activatedRoute: ActivatedRoute,
) {}

ngOnInit(): void {
  this.breadcrumbs$ = this.router.events.pipe(
    filter((event) => event instanceof NavigationEnd),
    distinctUntilChanged(),
    map((event) => {
      let root: ActivatedRoute = this.activatedRoute.root;
      return this.createBreadcrumbs(root);
    })
  );
}

router 每次更改的时後 都会触发许多事件,但我们只需要获取 NavigationEnd 这个事
件就可以了 distinctUntilChanged 只要 网址有更新 才会触发此事件,可以档掉许多连
续触发接下来再将拿到的参数进行操作


建立 Breadcrumb ( 面包屑 )

在 router 里 我们可以得到一些资讯 如... 当前路径当前路径里的参数子节点当前所使用
的组件等.....各种资讯

可以在 Angular ActivatedRoute
到更多资讯


概念

每次一次来就检测是否有下一个子节点,若是有的话 就继续再跑一次回圈如此重覆将面
包屑组起来,到达最後一个子节点时 会是一个 null 值,我们就能将先前组好的面包
屑回传出来,这时後会是一个阵列,接着再将它拿到 HTML 上显示!

JS

createBreadcrumbs( route, url: string = '', breadcrumbs = [] ) {
  const children = route.firstChild;

  if( !children ) {
    return breadcrumbs;
  }

  const routeURL: string = children.snapshot.url
    .map(segment => segment.path)
    .join('/');

  const label = children.snapshot.data['breadcrumb'];

  if( !label ) {
    return this.createBreadcrumbs( children, url,  breadcrumbs)
  }

  if ( !routeURL ) {
    url += `/${routeURL}`;
  }

  const breadcrumb = {
    label: label,
    params: children.snapshot.params,
    url: routeURL
  }

  return this.createBreadcrumbs( children, url,  [...breadcrumbs, breadcrumb])
}

先前我们将面包屑建立为一个 Observable,就直接到 html 里 使用 async 订阅再来就
可以撰写出我们想要的面包屑样式罗

HTML

<ul class="breadcrumb">
  <li *ngFor="let breadcrumb of breadcrumbs$ | async; last as isLast">
    <a [routerLink]="breadcrumb?.url" *ngIf="!isLast else last">
      {{ breadcrumb.label }}
      <ng-container *ngIf="breadcrumb?.params.name">
        - {{ breadcrumb?.params.name }}
      </ng-container>
    </a>
    <ng-template #last>
      {{ breadcrumb.label }}
      <ng-container *ngIf="breadcrumb?.params.name">
        - {{ breadcrumb?.params.name }}
      </ng-container>
    </ng-template>
  </li>
</ul>

实作如下: https://stackblitz.com/edit/angular-routing-breadcrumb


<<:  DAY 26- 分叉 Fork

>>:  Android学习笔记29

EIP (OA) 与 BPM 的差异为何?

常有客户问到 EIP (OA)内建的 workflow 与所谓的BPM 有何不同?? 为何两者价格差...

DE2_115(DAY2)用niosii和switch还有NiosII console去控制板子上的led

DE2_115(DAY2)用niosii和switch还有NiosII console去控制板子上的...

[Day 28] 建立 migration 时使用的套件,来谈谈 Flyway

昨天我们提到了建立 connection pool 时所使用的套件 HikariCP 今天,我们来谈...

【如何高效开发 ? 】测试驱动开发 | 3 大法则 + 5 大好处

撰写单元测试,速度更快 ! 大纲 除错的日常 测试驱动开发 三大法则 五大好处 JUnit 示范 违...

Day 25 递回神经网路 RNN 、梯度下降与梯度消失

介绍 递回神经网路 RNN (recurrent neural networks)是神经网路的一种,...