Angular: Pass Component to a Component Angular: Pass Component to a Component typescript typescript

Angular: Pass Component to a Component


You should not use an @Input to pass in the components. You can use @ContentChildren for that and an abstract WidgetComponent:

@Component({    selector: 'moving-grid',    template: `      <div class="widget-wrapper">         <ng-container *ngFor="let widget of widgets">             <!-- use a ngSwitchCase here for different types-->             <grid-test-widget [widget]="widget" *ngIf="widget.active && widget.type === 'test'"></grid-widget>         </ng-container>                </div>    `,    styleUrls: ['./grid.component.css']})export class GridComponent implements AfterContentInit {     @ContentChildren('widget')     widgets: QueryList<WidgetComponent>;     ngAfterContentInit() {        //your components will be available here     }}

The template of your third component will stay the same, but without the [widgets] and an added #widget name:

<moving-grid>   <test-widget class="grid-item-content-001" #widget [active]="false"></test>  <test-widget class="grid-item-content-002" #widget></test></moving-grid>

Your TestWidgetComponent which will extend an abstract WidgetComponent :

@Component({  selector: 'test-widget',  // ...})export class TestWidgetComponent extends WidgetComponent {    public type: string = 'test';}

And your WidgetComponent:

@Directive()export abstract class WidgetComponent {   @Input()   public active: boolean;   public type: string;}

And you'll have several grid widgets based on the type of the widget:

@Component({  selector: 'grid-test-widget',  template: `<div #content>I say hello<li>i</li><li>u</li><button (click)="test()">click me</button> world</div>`})export class GridTestWidgetComponent{}