You need to enable JavaScript to run this app. Ionic Angular读取JSON后NgFor遍历报错不支持对象类型问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Ionic Angular读取JSON后NgFor遍历报错不支持对象类型问题咨询

Ionic Angular 读取JSON文件遍历报错解决方案

错误根源

  • 报错1(NgFor不可迭代):服务返回的是包含categories数组的外层对象{categories: Array(9)},你直接将该对象赋值给页面用于遍历的变量,*ngFor仅支持遍历数组类型,无法直接遍历外层对象。
  • 报错2(push undefined):你声明了cdata:any[]但没有初始化空数组,未赋值的数组变量默认是undefined,调用push方法自然报错。
  • 额外问题:HTML模板中绑定的字段和JSON实际字段不匹配,JSON中只有c_id/c_name/c_description,没有id/name/title字段,后续即使遍历成功也会显示空值。

完整修复代码

1. 可注入服务类修改

import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { map } from 'rxjs/operators';
import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class CategoryData {
  // 初始化空数组存储处理后的分类数据
  private categories: any[] = [];

  constructor(public http: HttpClient) {}

  loadCategories(): Observable<any[]> {
    if (this.categories.length > 0) {
      // 已有缓存直接返回数组
      return of(this.categories);
    } else {
      // 注意文件名要和实际JSON文件名一致,你原文件是c_data.json不要写错
      return this.http.get('assets/data/c_data.json')
        .pipe(map(this.processData, this));
    }
  }

  processData(data: any): any[] {
    // 直接提取外层对象里的categories数组
    this.categories = data.categories || [];
    this.categories.forEach(category => {
      category ? console.log('Fetched', category.c_name) : console.log('Incapable to fetch category data');
    });
    // 返回数组而不是外层对象
    return this.categories;
  }

  getCategories(): Observable<any[]> {
    return this.loadCategories();
  }
}

2. 页面TS代码修改

import { Component } from '@angular/core';
import { CategoryData } from '替换为你的服务类实际路径';

@Component({
  selector: 'app-category-list',
  templateUrl: './category-list.page.html',
  styleUrls: ['./category-list.page.scss'],
})
export class CategoryListPage {
  // 初始化为空数组避免渲染时报错
  categories: any[] = [];

  constructor(public catData: CategoryData) {}

  ionViewDidEnter() {
    this.catData.getCategories().subscribe((categories: any[]) => {
      // 此时返回的已经是处理好的数组,直接赋值即可
      this.categories = categories;
    });
  }
}

3. HTML模板字段修正

<ion-grid fixed>
  <ion-row>
    <ion-col size="12" size-md="6" *ngFor="let cat of categories">
      <ion-card class="category-card">
        <ion-card-header>
          <ion-item detail="false" lines="none" class="category-item" routerLink="/app/tabs/categories/category-details/{{cat.c_id}}">
            <ion-avatar slot="start">
              <!-- 无profilePic时可以配置默认图避免显示裂图 -->
              <img [src]="cat.profilePic || 'assets/default-category-icon.png'" [alt]="cat.c_name + ' profile picture'">
            </ion-avatar>
            <ion-label>
              <!-- 替换为JSON中实际存在的字段 -->
              <h2>{{cat.c_name}}</h2>
              <p>{{cat.c_description}}</p>
            </ion-label>
          </ion-item>
        </ion-card-header>
        <ion-card-content>
          <ion-list lines="none">
            <ion-item detail="false" routerLink="/app/tabs/categories/category-details/{{cat.c_id}}">
              <ion-label>
                <h3>About {{cat.c_name}}</h3>
              </ion-label>
            </ion-item>
          </ion-list>
        </ion-card-content>
      </ion-card>
    </ion-col>
  </ion-row>
</ion-grid>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 03:45:03