如何访问 [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)
第二个选项对我来说更有意义,因为我可以更同步地处理代码。
我正在实施 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)
第二个选项对我来说更有意义,因为我可以更同步地处理代码。