Вы можете использовать ViewContainerRef
для динамического добавления компонентов.
Для этого вы можете просто добавить ng-template
к вашему компоненту html
файл со ссылкой на шаблон.
<ng-template #chatContainer></ng-template>
Затем в вашем *.component.ts
вы добавляете UserTextBubbleComponent
к ng-template
, используя ViewContainerRef
Чтобы получить ViewContainerRef
из шаблона, вы можете использовать #chatContainer
, который вы определили на предыдущем шаге, чтобы получить к нему доступ с помощью @ViewChild()
.
@ViewChild('chatContainer', {read: ViewContainerRef}) vc: ViewContainerRef;
Вам также понадобится ComponentFactoryResolver
, поэтому добавьте его к constructor()
constructor(private factory: ComponentFactoryResolver) {}
Чтобы добавить компонент к #chatContainer
, вы можете использовать этот метод
addComponent(text) {
const factory = this.factory.resolveComponentFactory(UserTextBubbleComponent);
const componentRef = this.vc.createComponent(factory);
(componentRef.instance).textToDisplay = text;
}
Этот метод делает то, что он создает ComponentFactoryResolver
для UserTextBubbleComponent
, что позволит вам создать его с помощью createComponent
.
Последняя строка вместо @Input()
внутри UserTextBubbleComponent
.
Чтобы использовать его таким образом, вам также необходимо определить textToDisplay
внутри компонента.
Так что добавьте textToDisplay
внутри UserTextBubbleComponent
, это будет значение пузыря чата.
public textToDisplay: string;
Возможно, вам также понадобится добавить UserTextBubbleComponent в массив entryComponents
. Внутри AppModule
добавьте это под imports
@NgModule({
imports: [ BrowserModule, ...],
declarations: [ AppComponent, UserTextBubbleComponent, ...],
bootstrap: [ AppComponent],
entryComponents: [UserTextBubbleComponent, ...]
})
export class AppModule { }
Я также сделал пример