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

Angular中*ngFor遍历自定义接口数组实现每行2个元素的问题

错误原因

你代码中的报错逻辑明确:*ngFor里的info是memberInfo数组遍历出来的单个MemberInfo对象,不是数组,你用数值索引[i+1]访问单个对象自然会触发类型错误。同时你当前的写法还会导致重复渲染:每遍历1个元素就生成1行,最终会出现好友信息重复展示、行数翻倍的问题。


解决方案

以下提供两种可直接落地的实现方式:

方案1:HTML层直接修复(最小改动)

仅在索引为偶数的时候渲染行,从memberInfo数组中取对应下标的元素,同时做好奇数个元素的越界兜底判断:

<div class="container">
  <ng-container *ngFor="let info of memberInfo; let i=index">
    <!-- 仅偶数索引生成行,避免重复渲染 -->
    <div class="row" *ngIf="i % 2 === 0">
      <!-- 第一列:当前索引元素必然存在 -->
      <div class="col-6">
        <div class="grid_text">
          <b> {{memberInfo[i].name}} </b>
          <b> {{memberInfo[i].surname}} | </b>
          <b> {{memberInfo[i].email}}  </b>
        </div>
      </div>
      <!-- 第二列:判断索引合法性后再渲染 -->
      <div class="col-6" *ngIf="i+1 < memberInfo.length">
        <div class="grid_text">
          <b> {{memberInfo[i+1].name}} </b>
          <b> {{memberInfo[i+1].surname}} | </b>
          <b> {{memberInfo[i+1].email}}  </b>
        </div>
      </div>
    </div>
  </ng-container>
</div>

方案2:组件层预处理数组(更易维护)

先在组件里把一维的memberInfo数组切割成每组2个元素的二维数组,模板直接循环行和列即可,逻辑更清晰,后续调整每行展示数量也更方便:

第一步:修改组件类逻辑

export class NetworkComponent implements OnInit {
  member_email!: string
  memberInfo!: MemberInfo[]
  // 新增二维数组,每一项对应一行的好友数据
  memberInfoRows: MemberInfo[][] = []

  constructor(private friendService: FriendService,
              private tokenStorage: TokenStorageService) { }

  ngOnInit(): void {
    this.member_email = this.tokenStorage.getEmail()
    this.friendService.getFriends(this.member_email).subscribe(
      (response: MemberInfo[]) => {
        this.memberInfo = response
        // 切割数组为每组2个元素
        this.memberInfoRows = this.chunkArray(response, 2)
      },
      (error: HttpErrorResponse) =>{
        alert(error.message);
      }
    )
  }

  // 新增数组切割工具方法
  private chunkArray(arr: MemberInfo[], size: number): MemberInfo[][] {
    const result: MemberInfo[][] = []
    for (let i = 0; i < arr.length; i += size) {
      result.push(arr.slice(i, i + size))
    }
    return result
  }
}

第二步:修改模板代码

<div class="container">
  <!-- 循环每一行 -->
  <div class="row" *ngFor="let row of memberInfoRows">
    <!-- 循环当前行的每个好友 -->
    <div class="col-6" *ngFor="let info of row">
      <div class="grid_text">
        <b> {{info.name}} </b>
        <b> {{info.surname}} | </b>
        <b> {{info.email}}  </b>
      </div>
    </div>
  </div>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:48:01