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

如何使用NgRx Entity实现本地Store与Firestore的同步?

解决NgRx与Firestore集合同步时删除条目不更新的问题

嘿,我完全懂你现在碰到的困扰——用NgRx Entity的upsertMany方法确实没法自动同步Firestore中已删除的条目,因为它的逻辑只覆盖新增或更新数据,不会处理那些不在新返回集合里的旧数据,这就是为什么用户得刷新才能看到删除效果。

问题根源

upsertMany的核心逻辑是遍历传入的每个数据项:如果本地Store里已有该ID的条目就更新,没有则添加,但它不会对比现有集合和新集合的差异,自然不会主动移除那些Firestore已经删掉的条目。

解决方案:改用setMany方法

NgRx Entity的setMany方法正好能解决这个问题——它会直接用传入的数组替换当前Entity集合中的所有数据,这样Firestore返回的集合里没有的条目,本地Store里也会同步移除,无需用户刷新。

修改你的Reducer代码如下:

on(fromBatch.loadBatchesSuccess, (state: any, action: any) => (
  userAdapter.setMany(action.users, {
    ...state,
    loaded: true,
    loading: false
  })
))

额外说明

  • setMany只会替换Entity管理的entities和ids部分,你State里的其他属性(比如loaded、loading)会通过扩展运算符...state保留下来,不用担心本地状态丢失。
  • 如果你的场景里需要同时处理本地临时修改(比如未同步到Firestore的草稿),可以结合selectAll先获取本地现有数据,再和Firestore返回的数据做合并处理,但如果是纯同步场景,直接用setMany就足够简洁有效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:16:39