如何在没有预先确定的 ViewContainerRef 的情况下向 DOM 动态添加角度组件?

Posted

技术标签:

【中文标题】如何在没有预先确定的 ViewContainerRef 的情况下向 DOM 动态添加角度组件?【英文标题】:How to dynamically add angular components to the DOM without a pre-determined ViewContainerRef? 【发布时间】:2019-09-07 19:03:06 【问题描述】:

这是我认为对其他人有用的解决方案。

这可以应用于任何未设置 ViewContainerRef 的原生元素。

我正在尝试在单击事件时在表格 (Tabulator v4.2) 中植入角度组件。该表是由插件动态创建的,因此我无法访问需要为其设置角度 ViewContainerRef 的 DOM 元素。 在点击事件回调中,我可以访问要添加角度组件的元素。

如何在没有设置角度 ViewContainerRef 的情况下将角度组件添加到该元素?

每次点击都应创建一个新组件并将其设置在给定的 DOM 元素中。

【问题讨论】:

【参考方案1】:

我使用 Angular 渲染器和 Angular 动态组件解决了这个问题。 Angular Dynamic Component Loader

父组件 HTML

<ng-template #willContainTheChildComponent></ng-template>

父组件类

@ViewChild('willContainTheChildComponent', read: ViewContainerRef) willContainTheChildComponent: ViewContainerRef;

constructor(private componentFactoryResolver: ComponentFactoryResolver,
    private renderer: Renderer2) 




//The click handler
            onClick: (e, row) => 
                const componentFactory = this.componentFactoryResolver.resolveComponentFactory(TheComponentClass);
                const component = this.willContainTheChildComponent.createComponent(componentFactory);
                //Here I have access to component.instance to manipulate the class' contents
                this.renderer.appendChild(row.getElement(), component.location.nativeElement);
            

【讨论】:

谢谢,这对 Angular 中的 Tabulator 非常有用。很好的解决方案! 您要求解决方案“没有预先确定的 ViewContainerRef”,但 &lt;ng-template #willContainTheChildComponent&gt;&lt;/ng-template&gt; 是预先确定的 ViewContainerRef。那为什么要用渲染器重新发明***呢? @Dimanoid 我需要它能够实例化一个角度组件。有没有办法从回调中立即在给定元素中设置角度组件?

以上是关于如何在没有预先确定的 ViewContainerRef 的情况下向 DOM 动态添加角度组件?的主要内容,如果未能解决你的问题,请参考以下文章

在颤动中 - 我如何最好地处理和分配预先确定的键给 json 中的嵌套列表/数组

如何根据预先确定的约束值自定义热图颜色?

如何预先确定malloc的大小以连接字符串数组?

是否可以使用 Javascript 在页面刷新时随机生成预先确定的链接颜色和悬停颜色?

打开带有预先确定的 cookie 集的网页

通过命名管道发送数据包?单字节缓冲区还是预先确定大小的?