带有面包屑的Angular 6过滤器显示错误

时间:2018-06-15 05:01:22

标签: javascript angular rxjs angular6

我已经完成了一个应用程序,并且在我的应用程序中使用了breadcrumb。

我的代码是这样的:

import { Component, OnInit, ViewEncapsulation } from '@angular/core';


import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';

import { BreadCrumb } from './breadcrumb';

import { map, filter} from 'rxjs/operators';

@Component({
  selector: 'app-breadcrumb',
  templateUrl: './breadcrumb.component.html',
  styleUrls: ['./breadcrumb.component.css'],
  encapsulation: ViewEncapsulation.None
})
export class BreadcrumbComponent implements OnInit {


  breadcrumbs$ = this.router.events
  .filter((event) => event instanceof NavigationEnd)
        .distinctUntilChanged()
        .map(event => this.buildBreadCrumb(this.activatedRoute.root));

    // Build your breadcrumb starting with the root route of your current activated route
    constructor(private activatedRoute: ActivatedRoute,
                private router: Router) {
    }

    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;
    }

}

BreadCrumbs 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>

如果我编译它然后显示此错误:

ERROR in src/app/share/components/breadcrumb/breadcrumb.component.ts(20,4): error TS2339: Property 'filter' does not exist on type 'Observable<Event>'.

我已多次尝试并搜索过谷歌但尚未找到解决方案。谁能帮帮我,告诉我哪里错了?

1 个答案:

答案 0 :(得分:2)

使用pipable运算符

  breadcrumbs$ = this.router.events.pipe(
         filter((event) => event instanceof NavigationEnd),
         distinctUntilChanged(),
         map(event => this.buildBreadCrumb(this.activatedRoute.root))
  );

Doc