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

如何将API获取数据渲染到Angular Material卡片及多数据不显示问题排查

问题根因

你当前代码的核心问题是存储应用数据的datr变量每次接口请求成功后都会被直接覆盖,而非追加新数据:

  • 遍历应用ID发起多次aplicacioninformacion请求时,每次请求成功都执行this.datr =(Object.values(Applicationdata)),后返回的请求结果会直接覆盖之前的结果
  • 最终datr数组中只会保留最后一次请求返回的应用数据,因此页面仅渲染1张卡片

修复方案

第一步:优化组件逻辑

建议使用RxJS的switchMap+forkJoin处理并行请求,避免嵌套订阅导致的内存泄漏风险,同时统一收集所有应用数据:
首先在组件类中声明datr为数组类型:

// 组件类中先声明datr
datr: any[] = [];

然后修改ngAfterViewInit中的调用逻辑:

import { forkJoin, switchMap } from 'rxjs';

ngAfterViewInit() {
  let userInfo = JSON.parse(localStorage.getItem("user"));
  const user = new User();
  user.email = userInfo.email;
  user.roles = userInfo.roles;
  this.userService.userinformacion(user).pipe(
    switchMap((userdata: any) => {
      // 生成所有应用详情的请求Observable数组
      const appRequests = userdata.user.registrations.map(reg => {
        const application = new ApplicationViewModel();
        application.id = reg.applicationId;
        return this.userService.aplicacioninformacion(application);
      });
      // 并行执行所有请求,统一返回所有结果
      return forkJoin(appRequests);
    })
  ).subscribe((appDataList: any[]) => {
    // 统一处理所有返回的应用数据,赋值给datr
    this.datr = appDataList.map(item => Object.values(item)).flat();
    // 如果你的Applicationdata本身就是单个应用对象,不需要Object.values,直接写this.datr = appDataList即可
  })
}

如果你不想修改原有请求逻辑,也可以选择最简单的修改方式:将赋值改为追加到数组:

// 原有请求逻辑里把this.datr = xxx 替换为:
this.datr.push(...Object.values(Applicationdata));

第二步:验证模板逻辑

你现有的HTML模板无需修改,*ngFor会自动遍历datr数组渲染所有卡片。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:54:03