Как удалить динамически созданный элемент Content Projection Transclusion в angular2?

Я создал два компонента виджета, например, виджет "Данные" и "Диаграмма", которые включаются другим компонентом с именем "Компонент карты". В компоненте "Карточка" я использовал общую кнопку закрытия, чтобы я мог использовать кнопку закрытия в каждом виджете по умолчанию. Виджет "Данные и диаграммы" создается динамически и сохраняется в массиве, и, наконец, компоненты отображаются в HTML-шаблон. Теперь я хотел бы удалить компоненты из массива, нажав кнопку закрытия на каждом виджете. Я пытался следующим образом,

CardComponent.ts

import { Component, Input, Output, EventEmitter } from '@angular/core';
import {WidgetComponent} from './widget.component';

@Component({      
    selector: 'card',
    templateUrl: 'card.component.html',
})
export class CardComponent {

    @Input()
    public header: string = 'this is header';

    @Input()
    public footer: string = 'this is footer';

    @Output() closeWidget = new EventEmitter();

    close(){
      console.log('Card close');
      this.closeWidget.emit();
    }        
}

CardComponent.html

<div class="card" style="border: 1px solid #d0d0d0;">
  <div class="card-header">        
    {{ header }}      
  <a (click)="close()" class="btn btn-primary">Close</a>
  </div>
  <ng-content></ng-content>
  <div class="card-footer">
    {{ footer }}       
  </div>
</div>

диаграмма-widget.component.ts

@Component({
selector: 'chart-widget',
templateUrl: './app/chart-widget.component.html',
providers: [{provide: WidgetComponent, useExisting: forwardRef(() => ChartWidget) }]
})

export class ChartWidget extends WidgetComponent implements OnInit {

}

график-widget.component.html

<card header="Chart Panel" footer="Footer here" class="ui-toolbar-group-
right">             
    <div class="card-block">
    <h4 class="card-title">Chart Card</h4>
    <p class="card-text">Chart showing here</p>

  </div>
</card>

AppComponent.ts

@Component({
  selector: 'app-root',
  templateUrl: './app/app.component.html',
  styleUrls: ['./app/app.component.css'],
  entryComponents: [ChartWidget,  DataWidget], 
})

export class AppComponent {
   private elements: Array<{ view: ViewRef, component: WidgetComponent}>=[];
   private WidgetClasses = {
      'ChartWidget': ChartWidget,
      'DataWidget': DataWidget        
  }
  @ViewChild(DynamicComponent) dynamicComponent:DynamicComponent;  


  addComponent(widget: string ): void{
    let component = this.dynamicComponent.addComponent(this.WidgetClasses[widget]);
    let view: ViewRef = this.dynamicComponent.container.detach(0);
    this.elements.push({view,component});

    this.dynamicComponent.resetContainer();
  }

  onWidgetDelete(element: any){
        console.log('Call Delete called');
        var index = this.elements.findIndex((elt) => (elt===element));
        if (index !== -1) {
            this.elements.splice(index, 1);
        }


    }
}

app.component.html

<button (click)="addComponent('ChartWidget')">Add ChartWidget</button>
<button (click)="addComponent('DataWidget')">Add DataWidget</button>

<dynamic-component [hidden]="true" ></dynamic-component>  

<hr>
Dynamic Components
<hr>
<widget *ngFor="let item of elements" (closeWidget)="onWidgetDelete(item)">
  <ng-container *view="item.view" ></ng-container>
</widget>

Я получаю сообщение о событии click на консоли, но EventEmitter не работает. Как удалить компоненты, нажав кнопку закрытия? Вот мой плункер https://plnkr.co/edit/tFmcpre6FHysJ1uUFPp5?p=preview

0 ответов

Другие вопросы по тегам