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

MGD*_*ies 1 angular angular-cdk

我正在实施 Angular 的 CDK 门户来加载动态组件。我能够使用给定的 html 和 app.ts 快速轻松地将组件加载到页面上。

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

是否可以访问该组件?


类/接口:

interface IPortalThing {
    doSomething(){...}
}
class PortalThingComponent
class OtherPortalComponent
Run Code Online (Sandbox Code Playgroud)

网址:

<ng-template [cdkPortalOutlet]="portal"></ng-template>
Run Code Online (Sandbox Code Playgroud)

应用程序

portal: Portal<any>;
...

loadComponent() {
    this.portal =  new ComponentPortal(PortalThingComponent));
}
Run Code Online (Sandbox Code Playgroud)

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

portal: Portal<IPortalThing>;
...

loadComponent() {
    this.portal =  new ComponentPortal<IPortalThing>(PortalThingComponent));
}
Run Code Online (Sandbox Code Playgroud)

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

Type 'ComponentPortal<IPortalThing>' is not assignable to type Portal<IPortalThing>'.
Run Code Online (Sandbox Code Playgroud)

这让我感到困惑。

MGD*_*ies 5

我找到了答案。

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

我们有几个选择:

活动

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

<ng-template (attached)="recieveReference(ref)" [cdkPortalOutlet]="portal"></ng-template>
Run Code Online (Sandbox Code Playgroud)

操纵指令

或者,我们可以完全删除门户的对象,而是直接从指令中工作。

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

const instance = cdkPortalOutlet.attach(portal)
Run Code Online (Sandbox Code Playgroud)

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

  • 您能分享一下模板吗? (3认同)