【问题标题】:How to populate Angular nested component in ngFor loop?如何在 ngFor 循环中填充 Angular 嵌套组件?
【发布时间】:2019-09-22 18:49:07
【问题描述】:

我在 html 端有一个嵌套组件,如下所示:

<main>
   <ng-content *ngFor="let item in data">
     <car *ngIf="item.type=='car'"></car>
     <plane *ngIf="item.type=='car'"></plane>
   </ng-content>
</main>

我的carplane 组件实现了一个基本的cehicle 类。

export abstract class BaseVehicleComponent{
    onVehicleCreated(){
        console.log("on vehicle created.")
    }
}

创建车辆时,我想在main 组件中填充一个事件。

@Component({
   selector: 'main',
})
export class MainComponent{

     @Output() vehicleCreated = new EventEmitter<void>();

}

hml 更新如下:

<main (vehicleCreated)="onVehicleCreated($event)">
   <ng-content *ngFor="let item in data">
     <car *ngIf="item.type=='car'"></car>
     <plane *ngIf="item.type=='car'"></plane>
   </ng-content>
</main>

但基本方法不会触发。

【问题讨论】:

  • 你在哪里打电话this.vehicleCreated.emit()
  • 如果您在 StackBlitz 上创建一个示例会很有帮助。
  • 其实无处可去,哪里可以调啊。主要部件和车辆部件是分开的,可能是不同的模块。所以我想做一个松耦合的通信。
  • @barteloma - 看看我的回答。

标签: angular angular7


【解决方案1】:

BaseVehicleComponent 应该有 EventEmitter 而不是 MainComponent

BaseVehicleComponent:

export abstract class BaseVehicleComponent{
   @Output() vehicleCreated = new EventEmitter<void>();
}

MainComponent 应该有 onVehicleCreated() 函数而不是 BaseVehicleComponent

主组件:

export class MainComponent{  
  onVehicleCreated(){
    console.log("on vehicle created.")
  }
}     

carplane组件的ngOnInit()方法调用事件发射器的emit()方法。

this.vehicleCreated.emit();

修改MainComponent的模板为

<ng-container *ngFor="let item in data">
  <car *ngIf="item.type=='car' (vehicleCreated)="onVehicleCreated($event)"></car>
  <plane *ngIf="item.type=='plane' (vehicleCreated)="onVehicleCreated($event)"></plane>
</ng-container>

StackBlitz 上的现场演示:https://stackblitz.com/edit/angular-thvzue

有关详细信息,请查看我的 answer 了解父组件和子组件之间的通信。

【讨论】:

  • @barteloma - 查看我编辑的答案。您还可以在 StackBlitz 上看到此功能。
  • 我把我的html
    放在app.component.html 中,所以因为onVehicleCreated() 没有找到而出错。
  • 不,只需将&lt;main&gt; 放入app-component。你可以在 StackBlitz 中看到我是如何做到的。
  • 我可以放入 app.component.html 并触发 mainComponent 的 onVehicleCreated() 吗?
  • 但是data 变量应该放在app-component 中。另外,当您将所有组件直接放在app-component 中时,main-component 的目的是什么?
猜你喜欢
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 2015-01-09
  • 1970-01-01
  • 2018-10-14
相关资源
最近更新 更多