diff --git a/modules/@angular/router/src/common_router_providers.ts b/modules/@angular/router/src/common_router_providers.ts index 70a534848a..8feb2c5e19 100644 --- a/modules/@angular/router/src/common_router_providers.ts +++ b/modules/@angular/router/src/common_router_providers.ts @@ -1,5 +1,5 @@ import {Location, LocationStrategy, PathLocationStrategy} from '@angular/common'; -import {APP_INITIALIZER, ApplicationRef, ComponentResolver, Injector} from '@angular/core'; +import {APP_INITIALIZER, ApplicationRef, ComponentResolver, Injector, OpaqueToken} from '@angular/core'; import {RouterConfig} from './config'; import {Router} from './router'; @@ -7,8 +7,48 @@ import {RouterOutletMap} from './router_outlet_map'; import {ActivatedRoute} from './router_state'; import {DefaultUrlSerializer, UrlSerializer} from './url_serializer'; +export const ROUTER_CONFIG = new OpaqueToken('ROUTER_CONFIG'); +export const ROUTER_OPTIONS = new OpaqueToken('ROUTER_OPTIONS'); + export interface ExtraOptions { enableTracing?: boolean; } +export function setupRouter( + ref, resolver, urlSerializer, outletMap, location, injector, config, opts) { + if (ref.componentTypes.length == 0) { + throw new Error('Bootstrap at least one component before injecting Router.'); + } + const componentType = ref.componentTypes[0]; + const r = + new Router(componentType, resolver, urlSerializer, outletMap, location, injector, config); + ref.registerDisposeListener(() => r.dispose()); + + if (opts.enableTracing) { + r.events.subscribe(e => { + console.group(`Router Event: ${(e.constructor).name}`); + console.log(e.toString()); + console.log(e); + console.groupEnd(); + }); + } + + return r; +} + +export function setupRouterInitializer(injector: Injector) { + // https://github.com/angular/angular/issues/9101 + // Delay the router instantiation to avoid circular dependency (ApplicationRef -> + // APP_INITIALIZER -> Router) + setTimeout(_ => { + const appRef = injector.get(ApplicationRef); + if (appRef.componentTypes.length == 0) { + appRef.registerBootstrapListener((_) => { injector.get(Router).initialNavigation(); }); + } else { + injector.get(Router).initialNavigation(); + } + }, 0); + return _ => null; +} + /** * A list of {@link Provider}s. To use the router, you must add this to your application. * @@ -27,59 +67,25 @@ export interface ExtraOptions { enableTracing?: boolean; } * bootstrap(AppCmp, [provideRouter(router)]); * ``` */ -export function provideRouter(config: RouterConfig, opts: ExtraOptions): any[] { +export function provideRouter(_config: RouterConfig, _opts: ExtraOptions): any[] { return [ + {provide: ROUTER_CONFIG, useValue: _config}, {provide: ROUTER_OPTIONS, useValue: _opts}, Location, {provide: LocationStrategy, useClass: PathLocationStrategy}, {provide: UrlSerializer, useClass: DefaultUrlSerializer}, { provide: Router, - useFactory: (ref, resolver, urlSerializer, outletMap, location, injector) => { - if (ref.componentTypes.length == 0) { - throw new Error('Bootstrap at least one component before injecting Router.'); - } - const componentType = ref.componentTypes[0]; - const r = new Router( - componentType, resolver, urlSerializer, outletMap, location, injector, config); - ref.registerDisposeListener(() => r.dispose()); - - if (opts.enableTracing) { - r.events.subscribe(e => { - console.group(`Router Event: ${(e.constructor).name}`); - console.log(e.toString()); - console.log(e); - console.groupEnd(); - }); - } - - return r; - }, - deps: - [ApplicationRef, ComponentResolver, UrlSerializer, RouterOutletMap, Location, Injector] + useFactory: setupRouter, + deps: [ + ApplicationRef, ComponentResolver, UrlSerializer, RouterOutletMap, Location, Injector, + ROUTER_CONFIG, ROUTER_OPTIONS + ] }, RouterOutletMap, {provide: ActivatedRoute, useFactory: (r) => r.routerState.root, deps: [Router]}, // Trigger initial navigation - { - provide: APP_INITIALIZER, - multi: true, - useFactory: (injector) => { - // https://github.com/angular/angular/issues/9101 - // Delay the router instantiation to avoid circular dependency (ApplicationRef -> - // APP_INITIALIZER -> Router) - setTimeout(_ => { - const appRef = injector.get(ApplicationRef); - if (appRef.componentTypes.length == 0) { - appRef.registerBootstrapListener((_) => { injector.get(Router).initialNavigation(); }); - } else { - injector.get(Router).initialNavigation(); - } - }, 0); - return _ => null; - }, - deps: [Injector] - } + {provide: APP_INITIALIZER, multi: true, useFactory: setupRouterInitializer, deps: [Injector]} ]; } diff --git a/modules/@angular/router/src/create_url_tree.ts b/modules/@angular/router/src/create_url_tree.ts index 32556d21be..941d2fc64f 100644 --- a/modules/@angular/router/src/create_url_tree.ts +++ b/modules/@angular/router/src/create_url_tree.ts @@ -195,7 +195,7 @@ function prefixedWith(segment: UrlSegment, startIndex: number, commands: any[]) currentPathIndex++; } - return { match: true, lastIndex: currentCommandIndex }; + return {match: true, lastIndex: currentCommandIndex}; } function createNewSegment(segment: UrlSegment, startIndex: number, commands: any[]): UrlSegment {