带有延迟加载模块的Angular Router面包屑

Cod*_*eed 5 lazy-loading breadcrumbs angular-ui-router angular

我正在使用Angular路由器动态添加面包屑。我遵循了几个示例,并让它们成功工作。

但是,如果尝试合并延迟加载的模块,则会收到错误消息:

Root segment cannot have matrix parameters
Run Code Online (Sandbox Code Playgroud)

我已经研究了该问题,但未能找到令人满意的信息/修复程序。

我用这个页面上要保存的大量代码创建了一个小工具:https : //plnkr.co/edit/505x2r

如何继续利用路由器中的动态面包屑创建功能,但同时也要使用延迟加载的路由。

import {NgModule} from '@angular/core';
import {RouterModule} from '@angular/router';

import { RootComponent } from 'src/root/root.component';
import { IndexComponent } from 'src/index/index.component';
import { SignupComponent } from 'src/signup/signup.component';
import { SigninComponent } from 'src/signin/signin.component';

@NgModule({
    imports: [
        RouterModule.forChild([
            {
            path: '',
            component: RootComponent,
            children: [
                {
                    path: 'signin',
                    loadChildren: 'src/signin/signin.module#SigninModule'
                },
                {
                    path: 'signup',
                    component: SignupComponent,
                    data: {
                        breadcrumb: 'Sign Up'
                    }
                },
                {
                    path: '',
                    component: IndexComponent
                }
            ]
        }
    ])
],
exports: [
    RouterModule
]
})
export class RootRoutingModule {}
Run Code Online (Sandbox Code Playgroud)

Cod*_*eed 5

感谢 Robert、Alex Beugnet 和 DAG 的评论,让我走上了寻求可靠解决方案的正确道路!

最后的 plunk 在这里:https ://plnkr.co/edit/iedQjH?p=preview

以下是我遇到的浓缩问题:

首先,我有延迟加载的路线,其中有面包屑形式的路线数据。当运行 getBreadcrumbs 时,面包屑标签会显示两次。我通过添加以下行解决了这个问题:

  if (
    child.snapshot.url.map(segment => segment.path).length === 0
  ) {
      return this.getBreadcrumbs(child, url, breadcrumbs);
  }
Run Code Online (Sandbox Code Playgroud)

其次,我的路线只是参数输入,但我需要将其列在面包屑路径上。通过映射 child.snapshot.url 并将该段分配给标签解决了这个问题。

const routeArray = child.snapshot.url.map(segment => segment.path);
for ( let i = 0; i < routeArray.length; i++ ) {
    label = routeArray[i];
}
Run Code Online (Sandbox Code Playgroud)

第三,我需要显示参数以及下一个路由的标签,无论它是立即加载还是通过模块延迟加载。我还遇到了以下需要拆分并适当分配标签的路径:

{
    path: ':id/products',
    loadChildren: 'src/products/products.module#ProductsModule',
    data: {
      breadcrumb: 'Products'
    }
}
Run Code Online (Sandbox Code Playgroud)

                {
                  path: 'orders/:id',
                  component: OrderComponent,
                  data: {
                    breadcrumb: 'Orders'
                  }
                },
Run Code Online (Sandbox Code Playgroud)

两者的解决方案是:

  for ( let i = 0; i < routeArray.length; i++ ) {
    if ( Object.keys(child.snapshot.params).length > 0 ) {
      if ( this.isParam(child.snapshot.params, routeArray[i]) ) {
        label = routeArray[i];
      } else {
        label = child.snapshot.data[ROUTE_DATA_BREADCRUMB];
      }
    } else {
      label = child.snapshot.data[ROUTE_DATA_BREADCRUMB];
    }
    const routeURL = routeArray[i];
    url += `/${routeURL}`;
    const breadcrumb: BreadCrumb = {
      label: label,
      params: child.snapshot.params,
      url: url
    };
    breadcrumbs.push(breadcrumb);
  }

private isParam(params: Params, segment: string) {
  for ( const key of Object.keys(params)) {
    const value = params[key];
    if ( value === segment ) {
      return true;
    }
  }
  return false;
}
Run Code Online (Sandbox Code Playgroud)

一切美好事物都有一个问题:每个参数都必须有一条路线

例如,如果您的网址为:#/quotes/123456/products/123456/Generic/Tissue,则您将需要以下路由:

{
  path: ':id',
  component: ProductComponent,
  data: 'data'
},
{
  path: ':id/:make',
  component: ProductComponent,
  data: 'data'
},
{
  path: ':id/:make/:model',
  component: ProductComponent,
  data: 'data'
}
Run Code Online (Sandbox Code Playgroud)

你最终会得到一个可点击的面包屑,如下所示:

主页 / 行情 / 123456 / 产品 / 123456 / 通用 / 纸巾

我正在从事的项目只需要我有一个参数......永远。

最后,我能够处理立即加载的路由和延迟加载的路由,这是我的最终目标。我确信有些情况我没有考虑到,但我觉得它非常可靠。

无论如何,我鼓励人们利用这里的东西并运用它。如果有任何更新,请给我留言,这样我就可以知道这还会变成什么!谢谢!