Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to place a dynamic component in a container

I want to create dynamic components and insert views of these components to a container.

I think this can be achieved by ViewContainerRef.

But I don't know, can we get ViewContainerRef of any component? if yes then how?. I am new to Angular, if there are any other good solutions available to handle this scenario, please suggest me.

Updated I think, I am pretty much near to the solution. Below is the code.

app.component.ts

import {Component} from '@angular/core'; import {ContainerComponet} from './container.component'  @Component({     selector: 'my-app',     template: `     <container> </container>     `,     directives: [ContainerComponet] }) export class AppComponent {      constructor() { }   } 

container.component.ts

import {Component, ComponentResolver, ViewContainerRef} from '@angular/core' import {controlBoxComponent as controlBox} from './controlBox.component';  @Component({     selector: 'container',     template: 'container'     }) export class ContainerComponet {     constructor(viewContainer: ViewContainerRef, private _cr: ComponentResolver) {          this._cr.resolveComponent(controlBox)             .then(cmpFactory => {                 const ctxInjector = viewContainer.injector;                 return viewContainer.createComponent(cmpFactory, 0,  ctxInjector);             })      } } 

controlBox.component.ts

import {Component} from '@angular/core' @Component({     selector: 'controlBox',     template: 'controlBox' }) export class controlBoxComponent {     constructor() { } } 

Output

<my-app>     <container>container</container><controlbox _ngcontent-lsn-3="">controlBox</controlbox> </my-app> 

Expected Result

<my-app>     <container>container     <controlbox _ngcontent-lsn-3="">controlBox</controlbox>     </container> </my-app> 
like image 572
Prem Parihar Avatar asked May 12 '16 11:05

Prem Parihar


People also ask

What is a dynamic component?

What dynamic components are. Dynamic means, that the components location in the application is not defined at buildtime. That means, that it is not used in any angular template. Instead, the component is instantiated and placed in the application at runtime.

What is ViewContainerRef in Angular?

ViewContainerRef represents a container where one or more views can be attached. The first thing to mention here is that any DOM element can be used as a view container. What's interesting is that Angular doesn't insert views inside the element, but appends them after the element bound to ViewContainer .


1 Answers

You can get the ViewContainerRef of the current component by or from an element in the view of the current component

@Component({   selector: '...',   directives: [OtherComponent, FooComponent],   template: `     <other-component></other-component>     <foo-component #foo></foo-component>     <div #div></div>` })  export class SomeComponent {   // `ViewContainerRef` from an element in the view   @ViewChild(OtherComponent, {read: ViewContainerRef}) other;   @ViewChild('foo', {read: ViewContainerRef}) foo;   @ViewChild('div', {read: ViewContainerRef}) div;    // `ViewContainerRef` from the component itself   constructor(private viewContainerRef:ViewContainerRef, private componentFactoryResolver: ComponentFactoryResolver) {}    let factory = this.componentFactoryResolver.resolveComponentFactory(ControlBox)   this.componentRef = this.other.createComponent(factory);   // this.componentRef = this.foo.createComponent(factory);   // this.componentRef = this.div.createComponent(factory);   // this.componentRef = this.viewContainerRef.createComponent(factory);   }); } 

See also Angular 2 dynamic tabs with user-click chosen components

like image 164
Günter Zöchbauer Avatar answered Sep 22 '22 01:09

Günter Zöchbauer