Как мне добавить угловые компоненты до или после элементов DOM в шаблоне?

#angular

#угловые

Вопрос:

Я хочу использовать метод Angular ViewContainerRef createComponent для динамического создания компонента и добавления его в представление с определенным индексом (до или после). Если я использую ViewContainerRef.createComponent и указываю индекс 0, компонент добавляется после любых статических элементов DOM в шаблоне.

В этом примере я ожидал бы, что компонент будет добавлен перед элементом «Template Div», но вместо этого он добавляется после. Компоненты, добавленные после этого, добавляются с правильным индексом, но никогда перед статическим элементом DOM.

https://stackblitz.com/edit/angular-dynamic-components-example-n6tae1?file=src/app/app.component.ts

Ответ №1:

Добро пожаловать в Stackoverflow. Что касается вашего вопроса,

ViewContainerRef представляет контейнер, к которому можно прикрепить одно или несколько представлений. Контейнер может содержать два вида представлений: основные представления (созданные путем создания экземпляра компонента с помощью метода createComponent()) и встроенные представления (созданные путем создания экземпляра TemplateRef с помощью метода createEmbeddedView()).

Ссылка: https://angular.io/api/core/ViewContainerRef#description

Другими словами, при использовании @ViewChild("container", { read: ViewContainerRef }) viewContainerRef: ViewContainerRef; вы ссылаетесь на <div #container></div> ViewContainerRef, который содержит только основные представления и встроенные представления (оба создаются динамически). Статические элементы внутри div не являются представлениями ViewContainerRef , поэтому, когда вы используете createComponent (метод, который создает представление хоста), передавая индекс в качестве второго параметра, этот индекс связан с коллекцией представлений, содержащихся в ViewContainerRef (который исключает статические элементы и включает только представления хоста и встроенные представления).

Обновить

Обходной путь для получения того, что вы хотите, делает что-то вроде этого

     <div id="main">     
    <div #containerBeforeTemplate></div>    
    <div>Template Div</div>     
    <div #containerAfterTemplate></div> 
    </div>
  

Комментарии:

1. Итак, нет способа добавить элементы перед статическими элементами DOM?

2. Вы могли бы сделать что-то вроде этого <div id="main"> <div #containerBeforeTemplate></div> <div>Template Div</div> <div #containerAfterTemplate></div> </div> , проверьте код после того, как я его обновил stackblitz.com/edit /. … Он делает то, что вы ожидали. Надеюсь, вы найдете это полезным.