11import {
22 Attribute , ComponentFactory , ComponentRef , Directive ,
3- ViewContainerRef ,
3+ ViewContainerRef , Type , InjectionToken ,
44 Inject , ComponentFactoryResolver , Injector
55} from "@angular/core" ;
66import { RouterOutletMap , ActivatedRoute , PRIMARY_OUTLET } from "@angular/router" ;
@@ -167,19 +167,22 @@ export class PageRouterOutlet { // tslint:disable-line:directive-class-suffix
167167 activatedRoute : ActivatedRoute ,
168168 outletMap : RouterOutletMap ,
169169 loadedResolver : ComponentFactoryResolver ) : void {
170- const factory = this . getComponentFactory ( activatedRoute , loadedResolver ) ;
171-
172170 const pageRoute = new PageRoute ( activatedRoute ) ;
173171
172+ let providers = new Map ( ) ;
173+ providers . set ( PageRoute , pageRoute ) ;
174+ providers . set ( ActivatedRoute , activatedRoute ) ;
175+ providers . set ( RouterOutletMap , outletMap ) ;
176+ const childInjector = new ChildInjector ( providers , this . location . injector ) ;
177+
178+ const factory = this . getComponentFactory ( activatedRoute , loadedResolver ) ;
174179 if ( this . isInitialPage ) {
175180 log ( "PageRouterOutlet.activate() initial page - just load component" ) ;
176181
177182 this . isInitialPage = false ;
178183
179- const injector = new OutletInjector ( activatedRoute , outletMap , this . location . injector ) ;
180184 this . currentActivatedComp = this . location . createComponent (
181- factory , this . location . length , injector , [ ] ) ;
182-
185+ factory , this . location . length , childInjector , [ ] ) ;
183186 this . currentActivatedComp . changeDetectorRef . detectChanges ( ) ;
184187
185188 this . refCache . push ( this . currentActivatedComp , pageRoute , outletMap , null ) ;
@@ -193,7 +196,7 @@ export class PageRouterOutlet { // tslint:disable-line:directive-class-suffix
193196 componentType : factory . componentType
194197 } ) ;
195198
196- const childInjector = new ChildInjector ( activatedRoute , outletMap , page , this . location . injector ) ;
199+ providers . set ( Page , page ) ;
197200
198201 const loaderRef = this . location . createComponent (
199202 this . detachedLoaderFactory , this . location . length , childInjector , [ ] ) ;
@@ -264,47 +267,23 @@ export class PageRouterOutlet { // tslint:disable-line:directive-class-suffix
264267 ) : ComponentFactory < any > {
265268 const snapshot = activatedRoute . _futureSnapshot ;
266269 const component = < any > snapshot . _routeConfig . component ;
267- let factory : ComponentFactory < any > ;
268270
269271 if ( loadedResolver ) {
270- factory = loadedResolver . resolveComponentFactory ( component ) ;
272+ return loadedResolver . resolveComponentFactory ( component ) ;
271273 } else {
272- factory = this . componentFactoryResolver . resolveComponentFactory ( component ) ;
273- }
274-
275- return factory ;
276- }
277- }
278-
279- class OutletInjector implements Injector {
280- constructor (
281- private route : ActivatedRoute , private map : RouterOutletMap , private parent : Injector ) { }
282-
283- get ( token : any , notFoundValue ?: any ) : any {
284- if ( token === ActivatedRoute ) {
285- return this . route ;
286- }
287-
288- if ( token === RouterOutletMap ) {
289- return this . map ;
274+ return this . componentFactoryResolver . resolveComponentFactory ( component ) ;
290275 }
291-
292- return this . parent . get ( token , notFoundValue ) ;
293276 }
294277}
295278
296- class ChildInjector extends OutletInjector {
279+ class ChildInjector implements Injector {
297280 constructor (
298- route : ActivatedRoute , map : RouterOutletMap , private page : Page , parent : Injector ) {
299- super ( route , map , parent ) ;
300- }
301-
302- get ( token : any , notFoundValue ?: any ) : any {
303- if ( token === Page ) {
304- return this . page ;
305- }
281+ private providers : Map < Type < any > | InjectionToken < any > , any > ,
282+ private parent : Injector
283+ ) { }
306284
307- return super . get ( token , notFoundValue ) ;
285+ get < T > ( token : Type < T > | InjectionToken < T > , notFoundValue ?: T ) : T {
286+ return this . providers . get ( token ) || this . parent . get ( token , notFoundValue ) ;
308287 }
309288}
310289
0 commit comments