Revert "fix(provider): fix a circular dependency & remove common providers"

This reverts commit 6375fdd4f2928d5ddeccaf11a8589a7668bc9049.
This commit is contained in:
vsavkin 2016-06-08 17:46:02 -07:00
parent f195bb608c
commit 29a7c4538c
2 changed files with 69 additions and 45 deletions

View File

@ -0,0 +1,62 @@
import {Location, LocationStrategy, PathLocationStrategy} from '@angular/common';
import {APP_INITIALIZER, ApplicationRef, ComponentResolver, Injector} from '@angular/core';
import {RouterConfig} from './config';
import {Router} from './router';
import {RouterOutletMap} from './router_outlet_map';
import {ActivatedRoute} from './router_state';
import {DefaultUrlSerializer, UrlSerializer} from './url_serializer';
/**
* A list of {@link Provider}s. To use the router, you must add this to your application.
*
* ### Example
*
* ```
* @Component({directives: [ROUTER_DIRECTIVES]})
* class AppCmp {
* // ...
* }
*
* const router = [
* {path: '/home', component: Home}
* ];
*
* bootstrap(AppCmp, [provideRouter(router)]);
* ```
*/
export function provideRouter(config: RouterConfig): any[] {
return [
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());
return r;
},
deps:
[ApplicationRef, ComponentResolver, UrlSerializer, RouterOutletMap, Location, Injector]
},
RouterOutletMap,
{provide: ActivatedRoute, useFactory: (r) => r.routerState.root, deps: [Router]},
// Trigger initial navigation
{
provide: APP_INITIALIZER,
multi: true,
useFactory: (router: Router) => router.initialNavigation(),
deps: [Router]
},
];
}

View File

@ -1,15 +1,12 @@
import {Location, LocationStrategy, PathLocationStrategy} from '@angular/common'; import {PlatformLocation} from '@angular/common';
import {APP_INITIALIZER, ApplicationRef, ComponentResolver, Injector} from '@angular/core'; import {BrowserPlatformLocation} from '@angular/platform-browser';
import * as common from './common_router_providers';
import {RouterConfig} from './config'; import {RouterConfig} from './config';
import {Router} from './router';
import {RouterOutletMap} from './router_outlet_map';
import {ActivatedRoute} from './router_state';
import {DefaultUrlSerializer, UrlSerializer} from './url_serializer';
/** /**
* A list of providers. To use the router, you must add this to your application. * A list of {@link Provider}s. To use the router, you must add this to your application.
* *
* ### Example * ### Example
* *
@ -19,50 +16,15 @@ import {DefaultUrlSerializer, UrlSerializer} from './url_serializer';
* // ... * // ...
* } * }
* *
* const routes = [ * const router = [
* {path: '/home', component: Home} * {path: '/home', component: Home}
* ]; * ];
* *
* bootstrap(AppCmp, [provideRouter(routes)]); * bootstrap(AppCmp, [provideRouter(router)]);
* ``` * ```
*/ */
export function provideRouter(config: RouterConfig): any[] { export function provideRouter(config: RouterConfig): any[] {
return [ return [
Location, {provide: PlatformLocation, useClass: BrowserPlatformLocation}, ...common.provideRouter(config)
{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());
return r;
},
deps:
[ApplicationRef, ComponentResolver, UrlSerializer, RouterOutletMap, Location, Injector]
},
RouterOutletMap,
{provide: ActivatedRoute, useFactory: (router) => router.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(_ => injector.get(Router).initialNavigation(), 0);
return _ => null;
},
deps: [Injector]
},
]; ];
} }