【发布时间】:2016-10-31 19:33:36
【问题描述】:
有没有办法在 Angular 2 中动态插入一个组件作为 DOM 标签的 child(不是兄弟)?
有很多例子可以插入动态组件作为给定ViewContainerRef 标记的兄弟,例如(从 RC3 开始):
@Component({
selector: '...',
template: '<div #placeholder></div>'
})
export class SomeComponent {
@ViewChild('placeholder', {read: ViewContainerRef}) placeholder;
constructor(private componentResolver: ComponentResolver) {}
ngAfterViewInit() {
this.componentResolver.resolveComponent(MyDynamicComponent).then((factory) => {
this.componentRef = this.placeholder.createComponent(factory);
});
}
}
但这会生成一个类似于:
<div></div>
<my-dynamic-component></my-dynamic-component>
预期结果:
<div>
<my-dynamic-component></my-dynamic-component>
</div>
使用SomeComponent 的ViewContainerRef 有相同的结果,它仍然将生成的组件作为兄弟插入,而不是子组件。如果模板为空并且在模板中插入动态组件(在组件选择器标记内),我可以接受。
在使用 ng2-dragula 等库从动态组件列表和benefit from the model updates 中拖动时,DOM 结构非常重要。额外的 div 在可拖动元素列表中,但在模型之外,破坏了拖放逻辑。
有人说这是不可能的 (c.f. this comment),但这听起来像是一个非常令人惊讶的限制。
【问题讨论】:
-
感谢您的快速回答和有用的链接! @pkozlowski 在这个讨论中给出了我的问题的答案:使用
<template #placeholder></template>而不是<div #placeholder></div>。 -
您是否有适用于指令的解决方案?因为这是组件
标签: angular