场景:
我用的是
signalStore(withEntities<Entity>() /*...*/)
。
我有一个用例,每当添加、更新或删除商店中的实体时,我想触发一些其他更新。
我想使用
effect()
- 但我错过了一个简单而优雅的解决方案来找出自上次调用效果函数以来发生了什么变化。
我什至没有获得之前的商店状态(就像在 Vue 中的
watch()
),所以我可以自己进行比较。
有什么建议吗?
理想情况下,我想要类似的东西
watchEntities(store, (updated: EntityId[], added: EntityId[], removed: EntityId[]) => {
// called as effect whenever things change in the store so I can
// do whatever I need to keep other things in sync with these entities
};
AI 建议这样做:
toObservable(store).pipe(
startWith(null),
pairwise()
).subscribe(([prev, current]) => {
if (prev === null) return; // Skip initial emission
// ...and an awful lot of code to detect the changes...
所以我想说,增强我的修改方法来触发操作很简单。
是的,您可以使用信号在创建新值时发出信号。但是,请记住,如果同步创建多个实体,信号将仅发出该批次中的最后一个值。
在您的场景中,我建议使用一个公开 Observable 的公共方法(以避免丢失值)和一个包含主题的私有方法(在方法名称前加上 _ 前缀)。在内部,你可以使用Subject来发出值,而暴露的Observable只是用asObservable包裹的Subject。
使用 NgRx 19,您将拥有一个
withProps
,它允许您直接将 Observable 添加为属性。
也就是说,更重要的问题是你是否真的需要这样做。由于实体只能在 SignalStore 中更新、修改或添加,因此您已经拥有了一个中心控制点。这允许您直接触发任何后处理。
如果这种方法对于您的用例来说是可行的,那么它肯定是我的首选解决方案。