diff --git a/packages/router/src/events.ts b/packages/router/src/events.ts index b1cc203dff..d4c7610c77 100644 --- a/packages/router/src/events.ts +++ b/packages/router/src/events.ts @@ -35,35 +35,6 @@ export class RouterEvent { public url: string) {} } -/** - * @whatItDoes Base for events tied to a specific `Route`, as opposed to events for the Router - * lifecycle. `RouteEvent`s may be fired multiple times during a single navigation and will - * always receive the `Route` they pertain to. - * - * Example: - * - * ``` - * class MyService { - * constructor(public router: Router, spinner: Spinner) { - * router.events.filter(e => e instanceof RouteEvent).subscribe(e => { - * if (e instanceof ChildActivationStart) { - * spinner.start(e.route); - * } else if (e instanceof ChildActivationEnd) { - * spinner.end(e.route); - * } - * }); - * } - * } - * ``` - * - * @experimental - */ -export class RouteEvent { - constructor( - /** @docsNotRequired */ - public route: Route) {} -} - /** * @whatItDoes Represents an event triggered when a navigation starts. * @@ -265,7 +236,10 @@ export class ResolveEnd extends RouterEvent { * * @experimental */ -export class RouteConfigLoadStart extends RouteEvent { +export class RouteConfigLoadStart { + constructor( + /** @docsNotRequired */ + public route: Route) {} toString(): string { return `RouteConfigLoadStart(path: ${this.route.path})`; } } @@ -274,7 +248,10 @@ export class RouteConfigLoadStart extends RouteEvent { * * @experimental */ -export class RouteConfigLoadEnd extends RouteEvent { +export class RouteConfigLoadEnd { + constructor( + /** @docsNotRequired */ + public route: Route) {} toString(): string { return `RouteConfigLoadEnd(path: ${this.route.path})`; } } @@ -284,7 +261,10 @@ export class RouteConfigLoadEnd extends RouteEvent { * * @experimental */ -export class ChildActivationStart extends RouteEvent { +export class ChildActivationStart { + constructor( + /** @docsNotRequired */ + public route: Route) {} toString(): string { return `ChildActivationStart(path: '${this.route.path}')`; } } @@ -294,7 +274,10 @@ export class ChildActivationStart extends RouteEvent { * * @experimental */ -export class ChildActivationEnd extends RouteEvent { +export class ChildActivationEnd { + constructor( + /** @docsNotRequired */ + public route: Route) {} toString(): string { return `ChildActivationEnd(path: '${this.route.path}')`; } } @@ -319,4 +302,5 @@ export class ChildActivationEnd extends RouteEvent { * * @stable */ -export type Event = RouterEvent | RouteEvent; +export type Event = RouterEvent | RouteConfigLoadStart | RouteConfigLoadEnd | ChildActivationStart | + ChildActivationEnd; diff --git a/packages/router/src/index.ts b/packages/router/src/index.ts index 75abe1211a..f658c9a4e8 100644 --- a/packages/router/src/index.ts +++ b/packages/router/src/index.ts @@ -11,7 +11,7 @@ export {Data, LoadChildren, LoadChildrenCallback, ResolveData, Route, Routes, Ru export {RouterLink, RouterLinkWithHref} from './directives/router_link'; export {RouterLinkActive} from './directives/router_link_active'; export {RouterOutlet} from './directives/router_outlet'; -export {ChildActivationEnd, ChildActivationStart, Event, GuardsCheckEnd, GuardsCheckStart, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, ResolveEnd, ResolveStart, RouteConfigLoadEnd, RouteConfigLoadStart, RouteEvent, RoutesRecognized} from './events'; +export {ChildActivationEnd, ChildActivationStart, Event, GuardsCheckEnd, GuardsCheckStart, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, ResolveEnd, ResolveStart, RouteConfigLoadEnd, RouteConfigLoadStart, RouterEvent, RoutesRecognized} from './events'; export {CanActivate, CanActivateChild, CanDeactivate, CanLoad, Resolve} from './interfaces'; export {DetachedRouteHandle, RouteReuseStrategy} from './route_reuse_strategy'; export {NavigationExtras, Router} from './router'; diff --git a/packages/router/src/pre_activation.ts b/packages/router/src/pre_activation.ts index e7d29466db..e5cea48475 100644 --- a/packages/router/src/pre_activation.ts +++ b/packages/router/src/pre_activation.ts @@ -19,7 +19,7 @@ import {mergeMap} from 'rxjs/operator/mergeMap'; import {reduce} from 'rxjs/operator/reduce'; import {LoadedRouterConfig, ResolveData, RunGuardsAndResolvers} from './config'; -import {ChildActivationStart, RouteEvent} from './events'; +import {ChildActivationStart, Event} from './events'; import {ChildrenOutletContexts, OutletContext} from './router_outlet_context'; import {ActivatedRouteSnapshot, RouterStateSnapshot, equalParamsAndUrlSegments, inheritedParamsDataResolve} from './router_state'; import {andObservables, forEach, shallowEqual, wrapIntoObservable} from './utils/collection'; @@ -43,7 +43,7 @@ export class PreActivation { constructor( private future: RouterStateSnapshot, private curr: RouterStateSnapshot, - private moduleInjector: Injector, private forwardEvent?: (evt: RouteEvent) => void) {} + private moduleInjector: Injector, private forwardEvent?: (evt: Event) => void) {} initalize(parentContexts: ChildrenOutletContexts): void { const futureRoot = this.future._root; diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index f9635c2e5b..48f1eaf6b4 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -21,7 +21,7 @@ import {applyRedirects} from './apply_redirects'; import {LoadedRouterConfig, QueryParamsHandling, Route, Routes, validateConfig} from './config'; import {createRouterState} from './create_router_state'; import {createUrlTree} from './create_url_tree'; -import {ChildActivationEnd, Event, GuardsCheckEnd, GuardsCheckStart, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, ResolveEnd, ResolveStart, RouteConfigLoadEnd, RouteConfigLoadStart, RouteEvent, RoutesRecognized} from './events'; +import {ChildActivationEnd, Event, GuardsCheckEnd, GuardsCheckStart, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, ResolveEnd, ResolveStart, RouteConfigLoadEnd, RouteConfigLoadStart, RouterEvent, RoutesRecognized} from './events'; import {PreActivation} from './pre_activation'; import {recognize} from './recognize'; import {DefaultRouteReuseStrategy, DetachedRouteHandleInternal, RouteReuseStrategy} from './route_reuse_strategy'; @@ -628,7 +628,7 @@ export class Router { const moduleInjector = this.ngModule.injector; preActivation = new PreActivation( snapshot, this.currentRouterState.snapshot, moduleInjector, - (evt: RouteEvent) => this.triggerEvent(evt)); + (evt: Event) => this.triggerEvent(evt)); preActivation.initalize(this.rootContexts); return {appliedUrl, snapshot}; }); @@ -764,7 +764,7 @@ export class Router { class ActivateRoutes { constructor( private routeReuseStrategy: RouteReuseStrategy, private futureState: RouterState, - private currState: RouterState, private forwardEvent: (evt: RouteEvent) => void) {} + private currState: RouterState, private forwardEvent: (evt: Event) => void) {} activate(parentContexts: ChildrenOutletContexts): void { const futureRoot = this.futureState._root; diff --git a/packages/router/test/integration.spec.ts b/packages/router/test/integration.spec.ts index 5c42074f5e..b4da6e9953 100644 --- a/packages/router/test/integration.spec.ts +++ b/packages/router/test/integration.spec.ts @@ -11,7 +11,7 @@ import {ChangeDetectionStrategy, Component, Injectable, NgModule, NgModuleFactor import {ComponentFixture, TestBed, fakeAsync, inject, tick} from '@angular/core/testing'; import {By} from '@angular/platform-browser/src/dom/debug/by'; import {expect} from '@angular/platform-browser/testing/src/matchers'; -import {ActivatedRoute, ActivatedRouteSnapshot, CanActivate, CanDeactivate, ChildActivationEnd, ChildActivationStart, DetachedRouteHandle, Event, GuardsCheckEnd, GuardsCheckStart, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, PRIMARY_OUTLET, ParamMap, Params, PreloadAllModules, PreloadingStrategy, Resolve, ResolveEnd, ResolveStart, RouteConfigLoadEnd, RouteConfigLoadStart, RouteEvent, RouteReuseStrategy, Router, RouterModule, RouterPreloader, RouterStateSnapshot, RoutesRecognized, RunGuardsAndResolvers, UrlHandlingStrategy, UrlSegmentGroup, UrlTree} from '@angular/router'; +import {ActivatedRoute, ActivatedRouteSnapshot, CanActivate, CanDeactivate, ChildActivationEnd, ChildActivationStart, DetachedRouteHandle, Event, GuardsCheckEnd, GuardsCheckStart, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, PRIMARY_OUTLET, ParamMap, Params, PreloadAllModules, PreloadingStrategy, Resolve, ResolveEnd, ResolveStart, RouteConfigLoadEnd, RouteConfigLoadStart, RouteReuseStrategy, Router, RouterEvent, RouterModule, RouterPreloader, RouterStateSnapshot, RoutesRecognized, RunGuardsAndResolvers, UrlHandlingStrategy, UrlSegmentGroup, UrlTree} from '@angular/router'; import {Observable} from 'rxjs/Observable'; import {Observer} from 'rxjs/Observer'; import {of } from 'rxjs/observable/of'; @@ -428,7 +428,7 @@ describe('Integration', () => { }]); const recordedEvents: any[] = []; - router.events.forEach(e => e instanceof RouteEvent || recordedEvents.push(e)); + router.events.forEach(e => e instanceof RouterEvent && recordedEvents.push(e)); router.navigateByUrl('/team/22/user/victor'); advance(fixture); @@ -986,7 +986,7 @@ describe('Integration', () => { [{path: 'simple', component: SimpleCmp, resolve: {error: 'resolveError'}}]); const recordedEvents: any[] = []; - router.events.subscribe(e => e instanceof RouteEvent || recordedEvents.push(e)); + router.events.subscribe(e => e instanceof RouterEvent && recordedEvents.push(e)); let e: any = null; router.navigateByUrl('/simple') !.catch(error => e = error); @@ -3344,7 +3344,7 @@ describe('Integration', () => { }]); const events: any[] = []; - router.events.subscribe(e => e instanceof RouteEvent || events.push(e)); + router.events.subscribe(e => e instanceof RouterEvent && events.push(e)); // supported URL router.navigateByUrl('/include/user/kate'); @@ -3408,7 +3408,7 @@ describe('Integration', () => { }]); const events: any[] = []; - router.events.subscribe(e => e instanceof RouteEvent || events.push(e)); + router.events.subscribe(e => e instanceof RouterEvent && events.push(e)); location.go('/include/user/kate(aux:excluded)'); advance(fixture); diff --git a/tools/public_api_guard/router/index.d.ts b/tools/public_api_guard/router/index.d.ts index 471c6e849e..92002f68d2 100644 --- a/tools/public_api_guard/router/index.d.ts +++ b/tools/public_api_guard/router/index.d.ts @@ -60,12 +60,18 @@ export interface CanLoad { } /** @experimental */ -export declare class ChildActivationEnd extends RouteEvent { +export declare class ChildActivationEnd { + route: Route; + constructor( + route: Route); toString(): string; } /** @experimental */ -export declare class ChildActivationStart extends RouteEvent { +export declare class ChildActivationStart { + route: Route; + constructor( + route: Route); toString(): string; } @@ -97,7 +103,7 @@ export declare class DefaultUrlSerializer implements UrlSerializer { export declare type DetachedRouteHandle = {}; /** @stable */ -export declare type Event = RouterEvent | RouteEvent; +export declare type Event = RouterEvent | RouteConfigLoadStart | RouteConfigLoadEnd | ChildActivationStart | ChildActivationEnd; /** @stable */ export interface ExtraOptions { @@ -284,20 +290,19 @@ export interface Route { } /** @experimental */ -export declare class RouteConfigLoadEnd extends RouteEvent { - toString(): string; -} - -/** @experimental */ -export declare class RouteConfigLoadStart extends RouteEvent { - toString(): string; -} - -/** @experimental */ -export declare class RouteEvent { +export declare class RouteConfigLoadEnd { route: Route; constructor( route: Route); + toString(): string; +} + +/** @experimental */ +export declare class RouteConfigLoadStart { + route: Route; + constructor( + route: Route); + toString(): string; } /** @stable */ @@ -339,6 +344,15 @@ export declare abstract class RouteReuseStrategy { abstract store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle | null): void; } +/** @experimental */ +export declare class RouterEvent { + id: number; + url: string; + constructor( + id: number, + url: string); +} + /** @stable */ export declare class RouterLink { fragment: string;