From 607f96e7bb44603124b140bc280404f785c143da Mon Sep 17 00:00:00 2001 From: crisbeto Date: Tue, 30 Oct 2018 20:18:11 +0100 Subject: [PATCH] fix(portal): use portal's ComponentFactoryResolver in portal outlet directive Follow-up from #12677 where we missed to add the new functionality to the `CdkPortalOutlet` directive. Fixes #9712. --- src/cdk/portal/portal-directives.ts | 5 +++-- src/cdk/portal/portal.spec.ts | 23 +++++++++++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/cdk/portal/portal-directives.ts b/src/cdk/portal/portal-directives.ts index e8870248b9ff..fab3606fc848 100644 --- a/src/cdk/portal/portal-directives.ts +++ b/src/cdk/portal/portal-directives.ts @@ -92,6 +92,7 @@ export class CdkPortalOutlet extends BasePortalOutlet implements OnInit, OnDestr this._attachedPortal = portal; } + /** Emits when a portal is attached to the outlet. */ @Output() attached: EventEmitter = new EventEmitter(); @@ -125,8 +126,8 @@ export class CdkPortalOutlet extends BasePortalOutlet implements OnInit, OnDestr portal.viewContainerRef : this._viewContainerRef; - const componentFactory = - this._componentFactoryResolver.resolveComponentFactory(portal.component); + const resolver = portal.componentFactoryResolver || this._componentFactoryResolver; + const componentFactory = resolver.resolveComponentFactory(portal.component); const ref = viewContainerRef.createComponent( componentFactory, viewContainerRef.length, portal.injector || viewContainerRef.injector); diff --git a/src/cdk/portal/portal.spec.ts b/src/cdk/portal/portal.spec.ts index cf905c2e997b..34606e7f9738 100644 --- a/src/cdk/portal/portal.spec.ts +++ b/src/cdk/portal/portal.spec.ts @@ -29,9 +29,14 @@ describe('Portals', () => { describe('CdkPortalOutlet', () => { let fixture: ComponentFixture; + let componentFactoryResolver: ComponentFactoryResolver; beforeEach(() => { fixture = TestBed.createComponent(PortalTestApp); + + inject([ComponentFactoryResolver], (cfr: ComponentFactoryResolver) => { + componentFactoryResolver = cfr; + })(); }); it('should load a component into the portal', () => { @@ -311,6 +316,20 @@ describe('Portals', () => { expect(instance.portalOutlet.hasAttached()).toBe(true); }); + it('should use the `ComponentFactoryResolver` from the portal, if available', () => { + const spy = jasmine.createSpy('resolveComponentFactorySpy'); + const portal = new ComponentPortal(PizzaMsg, undefined, undefined, { + resolveComponentFactory: (...args: any[]) => { + spy(); + return componentFactoryResolver.resolveComponentFactory + .apply(componentFactoryResolver, args); + } + }); + + fixture.componentInstance.portalOutlet.attachComponentPortal(portal); + expect(spy).toHaveBeenCalled(); + }); + }); describe('DomPortalOutlet', () => { @@ -324,8 +343,8 @@ describe('Portals', () => { let appRef: ApplicationRef; let deps = [ComponentFactoryResolver, Injector, ApplicationRef]; - beforeEach(inject(deps, (dcl: ComponentFactoryResolver, i: Injector, ar: ApplicationRef) => { - componentFactoryResolver = dcl; + beforeEach(inject(deps, (cfr: ComponentFactoryResolver, i: Injector, ar: ApplicationRef) => { + componentFactoryResolver = cfr; injector = i; appRef = ar; }));