You need to enable JavaScript to run this app. Angular 11:父传子嵌套API对象时子组件属性访问报错
优惠活动
大模型
产品
解决方案
定价
更多

Angular 11:父传子嵌套API对象时子组件属性访问报错

问题定位与修复步骤

核心错误汇总

  • 接口定义完全不符合API返回结构:
    对应接口返回的links是单个对象,并非数组;mission_patch_small是单个字符串类型的URL,不是字符串数组。同时子组件模板存在属性名拼写错误:将mission_patch_small错写为mission_small_patch(字段顺序颠倒)。
  • 父子组件输入绑定语法错误:
    父组件模板中子组件的传值写法完全不符合Angular规范,导致子组件无法接收selectedMission数据。
  • 冗余自定义管道:
    missionList本身就是API返回的数组,无需额外用keys管道做对象键值提取,该管道属于无效逻辑。
  • 类型报错根源:
    你将links定义为ILinks[](数组类型),模板中访问links.xxx相当于在数组类型上取自定义属性,因此TypeScript抛出Property 'xxx' does not exist on type 'ILinks[]'的错误。

逐段代码修正

1. 调整TypeScript接口定义

删除冗余调试字段,对齐API实际返回结构:

export interface IMission {
  mission_name: string;
  launch_year: string;
  details: string;
  links: ILinks;
}

export interface ILinks {
  mission_patch_small: string;
  // 其他需要用到的links字段可按需补充
}

2. 修正父组件模板逻辑

  • 调整子组件输入绑定为Angular标准语法
  • 删除冗余的keys管道
    修正后父组件模板代码:
<ul class="missions" *ngIf="missionList">
    <li *ngFor="let mission of missionList" (click)="onSelect(mission)">
    <span>{{mission.mission_name}}</span> -- {{mission.launch_year}}
        <p>{{mission.details}}</p>
        <aside><img [src]="mission?.links?.mission_patch_small" /></aside>
    </li>
</ul>

<app-missiondetails [mission]="selectedMission"></app-missiondetails>

3. 修正子组件模板的属性名拼写

将错误的mission_small_patch替换为正确字段名:

<ul *ngIf="mission">
    <li><span>{{mission.mission_name}}</span> {{mission.launch_year}}
        <p>{{mission.details}}</p>
        <p>{{mission.links | json}}</p>
        <aside><img [src]="mission?.links?.mission_patch_small" /></aside>
    </li>
</ul>

4. 清理冗余逻辑

之前尝试的resp.map(r => r.links)映射代码可直接删除,现有getMission()方法中this.missionList = resp的赋值逻辑正确,无需额外处理。

关于“重新保存接口文件临时生效”的解释

这是Angular开发服务器的热重载缓存导致的临时现象:保存接口文件时,TypeScript类型检查临时失效,若运行时缓存命中了正确的字段值,图片就会临时渲染,重载完成后类型检查恢复,错误会重新出现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 15:15:02