@@ -21,8 +24,10 @@ export class BreadcrumbComponent {
breadcrumbs: Breadcrumb[];
constructor(private breadcrumbService: BreadcrumbService) {
- breadcrumbService.onBreadcrumbChange.subscribe((crumbs: Breadcrumb[]) => {
- this.breadcrumbs = crumbs;
- });
+ breadcrumbService.breadcrumbChanged.subscribe((crumbs: Breadcrumb[]) => { this.onBreadcrumbChange(crumbs); });
+ }
+
+ private onBreadcrumbChange(crumbs: Breadcrumb[]) {
+ this.breadcrumbs = crumbs;
}
-}
\ No newline at end of file
+}
diff --git a/src/breadcrumb.module.ts b/src/breadcrumb.module.ts
index defe723..383749e 100644
--- a/src/breadcrumb.module.ts
+++ b/src/breadcrumb.module.ts
@@ -1,26 +1,20 @@
-import { NgModule, ModuleWithProviders } from "@angular/core";
+import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
-import { RouterModule } from '@angular/router';
-import { BreadcrumbComponent } from './src/breadcrumb.component';
-import { BreadcrumbService } from './src/breadcrumb.service';
+import { RouterModule, Router } from '@angular/router';
-export * from './src/breadcrumb.component';
-export * from './src/breadcrumb.service';
+import { BreadcrumbService } from './breadcrumb.service';
+import { BreadcrumbComponent } from './breadcrumb.component';
+
+export function breadcrumbServiceFactory(router: Router) {
+ return new BreadcrumbService(router);
+}
@NgModule({
- imports: [
- CommonModule,
- RouterModule
+ imports: [CommonModule, RouterModule],
+ providers: [
+ { provide: BreadcrumbService, useFactory: breadcrumbServiceFactory, deps: [Router] }
],
declarations: [BreadcrumbComponent],
- exports: [BreadcrumbComponent],
- providers: [BreadcrumbService]
+ exports: [BreadcrumbComponent]
})
-export class BreadcrumbModule {
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: BreadcrumbModule,
- providers: [BreadcrumbService]
- };
- }
-}
\ No newline at end of file
+export class BreadcrumbModule { }
diff --git a/src/breadcrumb.service.ts b/src/breadcrumb.service.ts
index b11a07d..37fa4bd 100644
--- a/src/breadcrumb.service.ts
+++ b/src/breadcrumb.service.ts
@@ -1,68 +1,80 @@
-import { Component, Injectable, EventEmitter } from "@angular/core";
-import { Title } from "@angular/platform-browser";
-import { Router, RoutesRecognized, NavigationEnd, ActivatedRouteSnapshot, ActivatedRoute } from "@angular/router";
-import { Observable } from "rxjs/Rx";
+import { Injectable, EventEmitter } from '@angular/core';
+import { Router, ActivatedRouteSnapshot, Event, NavigationEnd } from '@angular/router';
import { Breadcrumb } from './breadcrumb';
@Injectable()
export class BreadcrumbService {
- onBreadcrumbChange: EventEmitter = new EventEmitter(false);
+ breadcrumbChanged = new EventEmitter(false);
- private breadcrumbs: Breadcrumb[] = [];
+ private breadcrumbs = new Array();
constructor(private router: Router) {
- this.router.events.subscribe((routeEvent: NavigationEnd) => {
- if (!(routeEvent instanceof NavigationEnd)) return;
+ this.router.events.subscribe((routeEvent) => { this.onRouteEvent(routeEvent); });
+ }
- let route = this.router.routerState.root.snapshot;
- let url = "";
+ public changeBreadcrumb(route: ActivatedRouteSnapshot, name: string) {
+ const rootUrl = this.createRootUrl(route);
+ const breadcrumb = this.breadcrumbs.find(function (bc) { return bc.url === rootUrl; });
- this.breadcrumbs = [];
+ if (!breadcrumb) { return; }
- while (route.children.length) {
- route = route.firstChild;
- if (!route.routeConfig.path) continue;
+ breadcrumb.displayName = name;
- url += `/${this.createUrl(route)}`;
+ this.breadcrumbChanged.emit(this.breadcrumbs);
+ }
- if (!route.data["breadcrumb"]) continue;
+ private onRouteEvent(routeEvent: Event) {
+ if (!(routeEvent instanceof NavigationEnd)) { return; }
- this.breadcrumbs.push(this.createBreadcrumb(route, url));
- }
+ let route = this.router.routerState.root.snapshot;
+ let url = '';
- this.onBreadcrumbChange.emit(this.breadcrumbs);
- });
- }
+ this.breadcrumbs = [];
- public changeBreadcrumb(route: ActivatedRouteSnapshot, name: string) {
- let rootUrl = this.createRootUrl(route);
- let breadcrumb = this.breadcrumbs.find(bc => bc.url === rootUrl);
+ while (route.firstChild != null) {
+ route = route.firstChild;
- breadcrumb.displayName = name;
+ if (route.routeConfig === null) { continue; }
+ if (!route.routeConfig.path) { continue; }
- this.onBreadcrumbChange.emit(this.breadcrumbs);
+ url += `/${this.createUrl(route)}`;
+
+ if (!route.data['breadcrumb']) { continue; }
+
+ this.breadcrumbs.push(this.createBreadcrumb(route, url));
+ }
+
+ this.breadcrumbChanged.emit(this.breadcrumbs);
}
private createBreadcrumb(route: ActivatedRouteSnapshot, url: string): Breadcrumb {
return {
- displayName: route.data["breadcrumb"],
- terminal: route.children.length === 0 || !route.firstChild.routeConfig.path,
+ displayName: route.data['breadcrumb'],
+ terminal: this.isTerminal(route),
url: url
}
}
+ private isTerminal(route: ActivatedRouteSnapshot) {
+ return route.firstChild === null
+ || route.firstChild.routeConfig === null
+ || !route.firstChild.routeConfig.path;
+ }
+
private createUrl(route: ActivatedRouteSnapshot) {
- return route.url.map(s => s.toString()).join('/');
+ return route.url.map(function (s) { return s.toString(); }).join('/');
}
private createRootUrl(route: ActivatedRouteSnapshot) {
- let url = "";
+ let url = '';
let next = route.root;
- while (next.firstChild !== route) {
+ while (next.firstChild !== route && next.firstChild !== null) {
next = next.firstChild;
- if (!next.routeConfig.path) continue;
+
+ if (next.routeConfig === null) { continue; }
+ if (!next.routeConfig.path) { continue; }
url += `/${this.createUrl(next)}`;
}