Есть ли способ динамически вставлять компонент в качестве дочернего (не брата) тега DOM в Angular 2?
Здесь есть много примеров, чтобы вставить динамический компонент в качестве родного брата данного тега 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);
});
}
}
Но это порождает DOM, подобный:
<div></div>
<my-dynamic-component></my-dynamic-component>
Ожидаемый результат:
<div>
<my-dynamic-component></my-dynamic-component>
</div>
Использование SomeComponent
ViewContainerRef
имеет тот же результат, он по-прежнему вставляет сгенерированный компонент как родной, а не дочерний. Я был бы в порядке с решением, где шаблон пуст, а динамические компоненты вставлены в шаблон (в теге селектора компонентов).
Структура DOM очень важна при использовании библиотек, таких как ng2-dragula, перетащить из списка динамических компонентов и извлечь выгоду из обновлений модели. Дополнительный div находится в списке перетаскиваемых элементов, но вне модели, нарушая логику перетаскивания.
Некоторые говорят, что это невозможно (c.f. этот комментарий), но это звучит как очень удивительное ограничение.