如何访问 [cdkPortalOutlet] 中的组件引用

How to access a component reference in [cdkPortalOutlet]

我正在实施 Angular 的 CDK 门户来加载动态组件。 我能够使用给定的 html 和 app.ts.

快速轻松地将组件加载到页面上

加载组件后,我想访问它的接口方法 doSomething(),但是我似乎无法访问具有已加载。

是否可以访问该组件?


Classes/Interface:

interface IPortalThing {
    doSomething(){...}
}
class PortalThingComponent
class OtherPortalComponent

Html:

<ng-template [cdkPortalOutlet]="portal"></ng-template>

App.ts

portal: Portal<any>;
...

loadComponent() {
    this.portal =  new ComponentPortal(PortalThingComponent));
}

我试图通过以下方式给出类型指示:

portal: Portal<IPortalThing>;
...

loadComponent() {
    this.portal =  new ComponentPortal<IPortalThing>(PortalThingComponent));
}

但是,由于以下错误,这样做使我无法设置 this.portal:

Type 'ComponentPortal<IPortalThing>' is not assignable to type Portal<IPortalThing>'.

这让我感到困惑。

我找到了答案。

通过为 cdkPortalOutlet 设置参数,我们无法访问设置后返回的实例。

我们有几个选择:

活动

cdkPortalOutlet 在附加门户时触发事件。我们可以像收听其他活动一样收听它。

<ng-template (attached)="recieveReference(ref)" [cdkPortalOutlet]="portal"></ng-template>

操纵指令

或者,我们可以完全删除 portal 对象,而不是直接使用指令。

获取cdkPortalOutlet的@ViewChild,然后我们可以调用:

const instance = cdkPortalOutlet.attach(portal)

第二个选项对我来说更有意义,因为我可以更同步地处理代码。