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

如何在Ionic 3中使用*ngFor指令从Storage获取数据

没问题,我帮你梳理下怎么基于你现有的数据实现Ionic Storage的收藏列表功能,咱们一步步来:

1. 先确保Ionic Storage配置到位

首先得确认你已经安装并配置了@ionic/storage-angular:

  • 安装依赖:npm install @ionic/storage-angular
  • 在你的AppModule(或核心模块)里导入并配置Storage模块:
import { IonicStorageModule } from '@ionic/storage-angular';

@NgModule({
  imports: [
    // ...其他导入
    IonicStorageModule.forRoot()
  ]
})
export class AppModule {}
2. 改造你的数据提供者

接下来把收藏相关的方法整合到你的数据提供者里,结合你现有的items数组,代码示例如下:

import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage-angular';

@Injectable({
  providedIn: 'root'
})
export class DataProvider {
  // 你原有的数据列表
  private items: any[] = [ 
    { "name": "item 01", "description": "this is item 01", "id": "1" }, 
    { "name": "item 02", "description": "this is item 02", "id": "2" }, 
    { "name": "item 03", "description": "this is item 03", "id": "3" }, 
    { "name": "item 04", "description":"this is item 04", "id":"4" } 
  ];
  private storage: Storage | null = null;

  constructor(private storageInit: Storage) {
    // 初始化Storage
    this.initStorage();
  }

  // 异步初始化Storage(必须确保初始化完成后再操作)
  async initStorage() {
    const storage = await this.storageInit.create();
    this.storage = storage;
  }

  // 获取所有原始数据
  getAllItems() {
    return [...this.items];
  }

  // 添加单个项目到收藏
  async addToFavorites(item: any) {
    if (!this.storage) return;
    // 用item的id作为唯一键,避免重复存储
    await this.storage.set(`favorite_${item.id}`, item);
  }

  // 从收藏中移除项目
  async removeFromFavorites(itemId: string) {
    if (!this.storage) return;
    await this.storage.remove(`favorite_${itemId}`);
  }

  // 获取所有收藏的项目列表
  async getFavoriteItems(): Promise<any[]> {
    if (!this.storage) return [];
    const favorites: any[] = [];
    // 获取Storage中所有键,筛选出收藏相关的键
    const allKeys = await this.storage.keys();
    const favoriteKeys = allKeys.filter(key => key.startsWith('favorite_'));
    
    // 遍历键获取对应的收藏项目
    for (const key of favoriteKeys) {
      const item = await this.storage.get(key);
      favorites.push(item);
    }
    return favorites;
  }

  // 判断某个项目是否已收藏(用于UI上显示状态)
  async isItemFavorite(itemId: string): Promise<boolean> {
    if (!this.storage) return false;
    const item = await this.storage.get(`favorite_${itemId}`);
    return !!item; // 存在则返回true,否则false
  }
}
3. 在页面组件中使用这些方法

比如在你的收藏页面组件里,调用提供者的方法来展示和操作收藏列表:

import { Component, OnInit } from '@angular/core';
import { DataProvider } from '../services/data.provider';

@Component({
  selector: 'app-favorites',
  templateUrl: './favorites.page.html',
  styleUrls: ['./favorites.page.scss'],
})
export class FavoritesPage implements OnInit {
  favoriteItems: any[] = [];

  constructor(private dataProvider: DataProvider) { }

  async ngOnInit() {
    // 页面初始化时加载收藏列表
    this.favoriteItems = await this.dataProvider.getFavoriteItems();
  }

  // 切换项目的收藏状态(点击取消收藏时调用)
  async toggleFavorite(item: any) {
    const isFavorite = await this.dataProvider.isItemFavorite(item.id);
    if (isFavorite) {
      await this.dataProvider.removeFromFavorites(item.id);
    } else {
      await this.dataProvider.addToFavorites(item);
    }
    // 更新页面的收藏列表
    this.favoriteItems = await this.dataProvider.getFavoriteItems();
  }
}
4. 页面模板示例(收藏页面)
<ion-header>
  <ion-toolbar>
    <ion-title>我的收藏</ion-title>
  </ion-toolbar>
</ion-header>

<ion-content class="ion-padding">
  <ion-list>
    <ion-item *ngFor="let item of favoriteItems">
      <ion-label>
        <h2>{{ item.name }}</h2>
        <p>{{ item.description }}</p>
      </ion-label>
      <ion-button slot="end" (click)="toggleFavorite(item)">
        <ion-icon name="heart" color="danger"></ion-icon>
      </ion-button>
    </ion-item>
  </ion-list>

  <!-- 空状态提示 -->
  <ion-text *ngIf="favoriteItems.length === 0" class="ion-text-center">
    <p>还没有收藏任何项目哦~</p>
  </ion-text>
</ion-content>

这样你就可以完整实现从Ionic Storage中获取、添加、移除收藏数据的功能了,核心是利用item的唯一id作为Storage的键,确保数据存储和读取的准确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:15:34