You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular循环迭代中实现重复内容投影的技术咨询

需求可行,解决方案如下

问题原因

你当前的实现里,<ng-content>的工作机制是移动而非复制外部传入的DOM节点。也就是说,外部的<ion-label>只会被移动到组件内最后一次循环的<ng-content>位置,所以只会在最后一次迭代中显示。

解决思路

要实现每次迭代都渲染传入的内容,需要让父组件传入一个模板(TemplateRef),子组件在循环中复用这个模板,每次迭代都渲染该模板的副本,同时可以传递当前循环项的上下文数据。

修改后的代码实现

1. 子组件类(myComponent.ts)

添加输入属性和模板引用的获取:

import { Component, Input, ContentChild, TemplateRef } from '@angular/core';

@Component({
  selector: 'my-component',
  templateUrl: './myComponent.html'
})
export class MyComponent {
  @Input() dataProvider: any[] = [];
  // 获取父组件传入的模板
  @ContentChild(TemplateRef) itemTemplate!: TemplateRef<any>;
}

2. 子组件模板(myComponent.html)

在循环模板中通过ngTemplateOutlet渲染父组件传入的模板:

<ng-container *ngFor="let item of dataProvider">
  <ng-template *ngTemplateOutlet="tmpContent; context: {$implicit: item}">
  </ng-template>
</ng-container>

<ng-template #tmpContent let-item>
  <div>
    {{item.id}}
    <!-- 渲染父组件传入的模板,并传递当前item作为上下文 -->
    <ng-template *ngTemplateOutlet="itemTemplate; context: {$implicit: item}">
    </ng-template>
  </div>
</ng-template>

3. 使用示例

父组件中通过<ng-template>声明要重复渲染的内容,还可以通过let-item获取当前循环项的数据:

<my-component [dataProvider]="source">
  <ng-template let-item>
    <!-- 这里可以放任意内容,比如ion-label、自定义组件等 -->
    <ion-label> 测试内容 - 项ID: {{item.id}} </ion-label>
  </ng-template>
</my-component>

效果说明

这样修改后,每次循环都会渲染父组件传入的模板内容,每个迭代的内容都是独立的,而且可以访问当前循环的item数据,完全满足你声明式传入任意内容并在每次迭代中投影的需求。

内容的提问来源于stack exchange,提问作者Dimitar Marinov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:02:43