From 921a17960cbd4b5c071b5d05f4ed83f1b0484e7f Mon Sep 17 00:00:00 2001 From: vsavkin Date: Mon, 18 Jul 2016 16:07:12 -0700 Subject: [PATCH] fix(router): lazy loaded components should use loaded injector --- .../@angular/router/src/directives/router_outlet.ts | 9 ++++++--- modules/@angular/router/src/router.ts | 11 +++++++---- modules/@angular/router/test/router.spec.ts | 5 ++++- tools/public_api_guard/router/index.d.ts | 2 +- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/modules/@angular/router/src/directives/router_outlet.ts b/modules/@angular/router/src/directives/router_outlet.ts index 26729fa677..f394c9c4bd 100644 --- a/modules/@angular/router/src/directives/router_outlet.ts +++ b/modules/@angular/router/src/directives/router_outlet.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Attribute, ComponentFactory, ComponentFactoryResolver, ComponentRef, Directive, EventEmitter, NoComponentFactoryError, Output, ReflectiveInjector, ResolvedReflectiveProvider, ViewContainerRef} from '@angular/core'; +import {Attribute, ComponentFactory, ComponentFactoryResolver, ComponentRef, Directive, EventEmitter, NoComponentFactoryError, Output, ReflectiveInjector, ResolvedReflectiveProvider, ViewContainerRef, Injector} from '@angular/core'; import {RouterOutletMap} from '../router_outlet_map'; import {ActivatedRoute} from '../router_state'; @@ -72,7 +72,8 @@ export class RouterOutlet { activate( activatedRoute: ActivatedRoute, loadedResolver: ComponentFactoryResolver, - providers: ResolvedReflectiveProvider[], outletMap: RouterOutletMap): void { + loadedInjector: Injector, providers: ResolvedReflectiveProvider[], + outletMap: RouterOutletMap): void { this.outletMap = outletMap; this._activatedRoute = activatedRoute; @@ -99,7 +100,9 @@ export class RouterOutlet { factory = snapshot._resolvedComponentFactory; } - const inj = ReflectiveInjector.fromResolvedProviders(providers, this.location.parentInjector); + const injector = loadedInjector ? loadedInjector : this.location.parentInjector; + + const inj = ReflectiveInjector.fromResolvedProviders(providers, injector); this.activated = this.location.createComponent(factory, this.location.length, inj, []); this.activated.changeDetectorRef.detectChanges(); diff --git a/modules/@angular/router/src/router.ts b/modules/@angular/router/src/router.ts index 0dda7596da..2c19452f49 100644 --- a/modules/@angular/router/src/router.ts +++ b/modules/@angular/router/src/router.ts @@ -696,14 +696,17 @@ class ActivateRoutes { const config = closestLoadedConfig(this.futureState.snapshot, future.snapshot); let loadedFactoryResolver: ComponentFactoryResolver = null; + let loadedInjector: Injector = null; if (config) { - const loadedResolver = config.factoryResolver; - loadedFactoryResolver = loadedResolver; - resolved.push({provide: ComponentFactoryResolver, useValue: loadedResolver}); + loadedFactoryResolver = config.factoryResolver; + loadedInjector = config.injector; + resolved.push({provide: ComponentFactoryResolver, useValue: loadedFactoryResolver}); }; - outlet.activate(future, loadedFactoryResolver, ReflectiveInjector.resolve(resolved), outletMap); + outlet.activate( + future, loadedFactoryResolver, loadedInjector, ReflectiveInjector.resolve(resolved), + outletMap); } private deactivateOutletAndItChildren(outlet: RouterOutlet): void { diff --git a/modules/@angular/router/test/router.spec.ts b/modules/@angular/router/test/router.spec.ts index 0a14d504e0..3a027b4860 100644 --- a/modules/@angular/router/test/router.spec.ts +++ b/modules/@angular/router/test/router.spec.ts @@ -1279,14 +1279,17 @@ describe('Integration', () => { [Router, TestComponentBuilder, Location, AppModuleFactoryLoader], (router: Router, tcb: TestComponentBuilder, location: Location, loader: SpyAppModuleFactoryLoader) => { + class LazyLoadedService {} + @Component({selector: 'lazy', template: 'lazy-loaded', directives: ROUTER_DIRECTIVES}) class LazyLoadedComponent { + constructor(service: LazyLoadedService) {} } @AppModule({ precompile: [LazyLoadedComponent], providers: [ - provideRoutes([{ + LazyLoadedService, provideRoutes([{ path: '', canActivate: ['alwaysTrue'], children: [{path: 'loaded', component: LazyLoadedComponent}] diff --git a/tools/public_api_guard/router/index.d.ts b/tools/public_api_guard/router/index.d.ts index a7cf3ba3d0..e85a3bbe62 100644 --- a/tools/public_api_guard/router/index.d.ts +++ b/tools/public_api_guard/router/index.d.ts @@ -194,7 +194,7 @@ export declare class RouterOutlet { isActivated: boolean; outletMap: RouterOutletMap; constructor(parentOutletMap: RouterOutletMap, location: ViewContainerRef, resolver: ComponentFactoryResolver, name: string); - activate(activatedRoute: ActivatedRoute, loadedResolver: ComponentFactoryResolver, providers: ResolvedReflectiveProvider[], outletMap: RouterOutletMap): void; + activate(activatedRoute: ActivatedRoute, loadedResolver: ComponentFactoryResolver, loadedInjector: Injector, providers: ResolvedReflectiveProvider[], outletMap: RouterOutletMap): void; deactivate(): void; }