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

如何强制ngrx-data清除缓存实体并从数据库重新加载数据

问题原因

你直接修改了从getAll()订阅拿到的实体对象,该对象是ngrx-data缓存中实体的直接引用,因此即使你没有调用任何持久化或标准更新方法,也已经通过mutable 操作污染了本地缓存,这是问题的核心根源。
你之前尝试的clearCache()后调用普通getAll()无效的原因是:getAll()默认走缓存优先策略,只要检测到缓存中存在对应实体集合就直接返回本地数据,不会发起后端请求拉取原始数据。

可行解决方案

方案1:从根源避免缓存污染(最推荐)

不要直接使用从服务获取的实体引用绑定表单,而是做深拷贝生成本地副本后再绑定表单:

this.userService.getAll().subscribe(d => {
  // 深拷贝生成本地副本,修改副本不会影响缓存
  this.data = structuredClone(d);
  // 同时存一份初始值,取消修改时直接重置即可
  this.originalData = structuredClone(d);
})

用户点击取消时不需要操作缓存,直接把本地表单值重置为originalData即可,全程不会影响缓存状态。

方案2:强制从后端拉取最新数据覆盖缓存

如果已经污染了缓存,需要刷新缓存内容,可以调用ngrx-data内置的强制拉取方法getAllWithForce(),该方法会跳过本地缓存直接发起后端请求,拉取到的最新数据会自动覆盖现有缓存:

// 无需提前调用clearCache,该方法返回的就是后端最新数据
this.data$ = this.userService.getAllWithForce();
this.data$.subscribe(d => { this.data = d; })

方案3:本地直接恢复缓存初始值(无需发后端请求)

如果你本地保留了缓存修改前的初始数据副本,可以直接调用upsertMany方法把初始值写回缓存,覆盖被篡改的内容:

this.userService.upsertMany(this.originalData);
// 之后再调用普通getAll拿到的就是恢复后的初始数据
this.data$ = this.userService.getAll();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:06:04