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

Ionic 6导入CommonModule后*ngFor仍无法识别问题求助

Ionic v6中*ngFor无法识别导致列表空白问题修复

问题描述

基于Ionic v6开发项目,需从后端请求JSON数组并以列表展示。通过ionic g page blablabla创建页面后,已在对应module.ts中导入CommonModule,控制台输出显示逻辑正常,但访问页面时控制台报错*ngFor无法识别,页面仅显示头部,列表内容空白。

相关代码

HTML代码

<ion-header>
  <ion-toolbar>
    <ion-title>overviewMemorialPages</ion-title>
  </ion-toolbar>
</ion-header>
    
<ion-content>
  <div class="MemorialPageHeader">
    <ion-list *ngFor="let product for products">
      <ion-item>
        <h1>Hellooo!!!</h1>
        {{product.name}}
      </ion-item>
    </ion-list>
  </div>
</ion-content>

page.ts代码

import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { ToastController } from '@ionic/angular';
import { TranslateService } from '@ngx-translate/core';
import { RestService } from 'src/app/service/rest.service';

@Component({
  selector: 'app-overview-memorial-pages',
  templateUrl: './overview-memorial-pages.page.html',
  styleUrls: ['./overview-memorial-pages.page.scss'],
})
export class OverviewMemorialPagesPage implements OnInit {

  products: any [] = [{
    name: "test product"
  }];

  constructor(
    private router:Router, 
    private toastController:ToastController, 
    private translate:TranslateService, 
    public restservice:RestService,
    private cd: ChangeDetectorRef,
    ) { 
    }

  ngOnInit() {
    this.loadPages();
    this.products.push({name: "hi"});
    console.log(JSON.stringify(this.products));
  }

  showEmpty() {

  }

  loadItem(data: any) {
    console.log(data.name)
    console.log(data.description)
    console.log('view-memorial-page?id=' + data.id)
    this.cd.detectChanges();
  }

  async loadPages() {
    this.restservice.getMyMemorialPages().subscribe(
      (async (response) => {
        console.log(JSON.stringify(response))
        if(response.length < 1) {
          this.showEmpty();
          return;
        }
        response.forEach((data) => this.loadItem(data))
      }),
      (async (error) => {
        console.error('ERROR: ' + JSON.stringify(error));
          let errMsg:string;
          if(error.status == 0){
            errMsg = "The service is currently unavailable. Please try again later.";
          }else{
            errMsg = error.error.error.message;
          }
          const toast = await this.toastController.create({
            message: errMsg,
            duration: 3500,
            color: 'danger',
            position: 'middle'
          });
          await toast.present();
      }),
    );
  }
}

module.ts代码

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { IonicModule } from '@ionic/angular';
import { OverviewMemorialPagesPageRoutingModule } from './overview-memorial-pages-routing.module';
import { OverviewMemorialPagesPage } from './overview-memorial-pages.page';
import { TranslateModule } from '@ngx-translate/core';

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    IonicModule,
    OverviewMemorialPagesPageRoutingModule,
    TranslateModule
  ],
  declarations: [OverviewMemorialPagesPage],
})
export class OverviewMemorialPagesPageModule {}

修复方案

1. 修复*ngFor语法错误

这是导致报错的核心原因:Angular的*ngFor语法要求使用of而非for,同时ion-list是列表容器,不应将循环指令绑定在容器上,否则会为每个数据项生成独立列表。修改后的HTML代码:

<ion-list>
  <ion-item *ngFor="let product of products">
    <h1>Hellooo!!!</h1>
    {{product.name}}
  </ion-item>
</ion-list>

2. 绑定后端返回的数据

当前代码仅打印后端数据,未将其赋值给products数组,导致后端数据无法渲染。修改loadPages方法的成功回调:

async loadPages() {
  this.restservice.getMyMemorialPages().subscribe(
    (response) => {
      console.log(JSON.stringify(response))
      if(response.length < 1) {
        this.showEmpty();
        return;
      }
      // 将后端数据赋值给products数组
      this.products = response;
      // 若需保留原有测试数据,改用扩展运算符:
      // this.products.push(...response);
      response.forEach((data) => this.loadItem(data))
    },
    // 错误回调保持不变
    async (error) => {
      console.error('ERROR: ' + JSON.stringify(error));
      let errMsg:string;
      if(error.status == 0){
        errMsg = "服务当前不可用,请稍后重试。";
      }else{
        errMsg = error.error.error.message;
      }
      const toast = await this.toastController.create({
        message: errMsg,
        duration: 3500,
        color: 'danger',
        position: 'middle'
      });
      await toast.present();
    },
  );
}

3. 移除不必要的变更检测调用

loadItem方法中的this.cd.detectChanges()属于冗余代码,Angular会自动处理数据变更后的视图更新,除非组件使用了ChangeDetectionStrategy.OnPush,否则可以直接移除该调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:55:15