Vous pouvez utiliser ViewContainerRef
pour ajouter dynamiquement des composants.
Pour cela, il suffit d'ajouter ng-template
à votre composant html
avec la référence du modèle.
<ng-template #chatContainer></ng-template>
Alors dans votre *.component.ts
vous ajoutez UserTextBubbleComponent
à la ng-template
en utilisant ViewContainerRef
Pour obtenir ViewContainerRef
à partir du modèle, vous pouvez utiliser le #chatContainer
que vous avez défini à l'étape précédente pour y accéder en utilisant la fonction @ViewChild()
.
@ViewChild('chatContainer', {read: ViewContainerRef}) vc: ViewContainerRef;
Vous aurez également besoin de ComponentFactoryResolver
donc l'ajouter à constructor()
constructor(private factory: ComponentFactoryResolver) {}
Pour ajouter un composant au #chatContainer
vous pouvez utiliser cette méthode
addComponent(text) {
const factory = this.factory.resolveComponentFactory(UserTextBubbleComponent);
const componentRef = this.vc.createComponent(factory);
(componentRef.instance).textToDisplay = text;
}
Ce que cette méthode fait, c'est qu'elle crée ComponentFactoryResolver
pour UserTextBubbleComponent
ce qui vous permettra de le créer en createComponent
.
La dernière ligne est là au lieu d'une @Input()
à l'intérieur de la UserTextBubbleComponent
.
Pour pouvoir l'utiliser de cette manière, vous devez également définir l'attribut textToDisplay
à l'intérieur du composant.
Alors, ajoutez textToDisplay
à l'intérieur de la UserTextBubbleComponent
ce sera la valeur de la bulle de dialogue.
public textToDisplay: string;
Vous aurez probablement besoin d'ajouter le composant UserTextBubbleComponent à la liste des composants suivants entryComponents
le tableau. A l'intérieur de AppModule
ajouter ceci sous imports
@NgModule({
imports: [ BrowserModule, ...],
declarations: [ AppComponent, UserTextBubbleComponent, ...],
bootstrap: [ AppComponent],
entryComponents: [UserTextBubbleComponent, ...]
})
export class AppModule { }
J'ai également fait un exemple