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)
这让我感到困惑。
我找到了答案。
通过为 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)
第二个选项对我来说更有意义,因为我可以更同步地处理代码。
| 归档时间: |
|
| 查看次数: |
1564 次 |
| 最近记录: |