代码之家  ›  专栏  ›  技术社区  ›  moh

角度5在某些部件中有面包屑

  •  3
  • moh  · 技术社区  · 6 年前

    在我的angular 5项目中,我尝试为我的组件创建面包屑,我遵循了以下指南 https://medium.com/@bo.vandersteene/angular-5-breadcrumb-c225fd9df5cf

    通过瘦面包屑仅显示应用程序组件。html文件,它不会显示在其他组件中。。。我想在某些组件中添加beadcrumb。

    例如:

    export class BreadcrumbComponent implements OnInit {
        breadcrumbs$;
        // Build your breadcrumb starting with the root route of your current activated route
        constructor(private activatedRoute: ActivatedRoute,
                    private router: Router) {
           this.breadcrumbs$ = this.router.events
            .filter(event => event instanceof NavigationEnd)
            .distinctUntilChanged()
            .map(event => this.buildBreadCrumb(this.activatedRoute.root));
    
        }
    
        ngOnInit() {
        }
    
        buildBreadCrumb(route: ActivatedRoute, url: string = '',
                        breadcrumbs: Array<BreadCrumb> = []): Array<BreadCrumb> {
            // If no routeConfig is avalailable we are on the root path
            const label = route.routeConfig ? route.routeConfig.data[ 'breadcrumb' ] : 'Home';
            const path = route.routeConfig ? route.routeConfig.path : '';
            // In the routeConfig the complete path is not available,
            // so we rebuild it each time
            const nextUrl = `${url}${path}/`;
            const breadcrumb = {
                label: label,
                url: nextUrl
            };
            const newBreadcrumbs = [ ...breadcrumbs, breadcrumb ];
            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;
        }
    }
    

    html:

    <ol class="breadcrumb">
      <li *ngFor="let breadcrumb of breadcrumbs$ | async"
          class="breadcrumb-item">
        <a [routerLink]="[breadcrumb.url, breadcrumb.params]">
          {{ breadcrumb.label }}
        </a>
      </li>
    </ol>
    

    我将路由器事件移动到构造函数以检测路由器更改,但它在其他组件中仍然没有显示任何内容 ..在他的代码中,如果我们移动到内容组件,它也不会显示任何内容。

    我怎样才能解决这个问题?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Tomasz Kula    6 年前

    此组件只能在 app.component ,因为它正在侦听路由器事件。

    在中创建的任何组件 app.component's <router-outlet> 在导航完成后创建。因此,您的子组件无法对任何导航事件做出反应。

    我建议您创建 breadcrumbs$ 中的流 应用程序。组成部分 并重构面包屑组件以接受 ActivatedRoute 作为 @Input()

        2
  •  0
  •   pouyada    6 年前

    正如Tomasz Kula所说,至少在正常情况下,您不能订阅子组件中的任何导航事件。

    您可以使用 Subject (最好使用 BehaviorSubject )在其中,订阅应用程序组件中的路由事件,以便不断更新主题。然后将服务注入子组件并订阅主题。

        3
  •  0
  •   topekTopperson    5 年前

    实际上,您不需要订阅应用程序组件中的路由事件。 您所需要做的就是创建全局可观察数据服务,该服务将侦听它们,然后在您的组件中使用它。如果嵌套很深,则在事件中有效。

    类似的答案如下: https://stackoverflow.com/a/36157392