使用 @ngrx/data,如何从更新到自定义数据服务上的实体形成 JSON 补丁文档?
Using @ngrx/data, how can you form JSON patch documents from updates to entities on a custom data service?
我的@ngrx/data 用例要求我通过扩展 DefaultDataService<T>
来构建自定义实体数据服务。我正在使用的 API 接受 JSON 更新补丁文件。 EntityCollectionDataService<T>
定义了以下更新函数:
update(update: Update<T>): Observable<T>;
其中 Update<T>
具有类型为 Partial<T>
的成员 changes
。我在这里面临的问题是我无法形成一个 JSON 补丁文档,其中只有一部分已更改的实体字段。我需要实体的未更改和更改状态。
我在这里看到的唯一解决方案是通过 EntityCollectionService
为我的实体访问 EntityChangeTracker
,我对如何使用更改跟踪器有点困惑,因为它是只是通过 EntityCollectionService 的 changeState$
字段可观察到的变化流。
有没有我在这里没有看到的更简单的方法?我还想只访问商店并拉取实体的当前状态,但我更喜欢使用乐观并发,所以当我正在写的 DefaultDataService
被调用时,商店已经改变了更新效果。
事实证明,正如我所料,你可以通过观察EntityChangeTracker中发生的变化来形成补丁文档。只需订阅 changeState$
,检查状态更改是否为更新,然后继续比较原始内容与修改后的内容。
我通过 update
方法在我的数据服务中返回一个 Observable,并检查更新的内容是否在 changeState
地图中有一个键来做到这一点。
update = (entity: Update<TEntity>): Observable<TEntity> => {
/**
* Since we are needing to perform extra logic to
* retrieve an original copy of the modified entity,
* we are returning a new Observable.
*/
return new Observable<TEntity>((subscriber) => {
// Pull the entity change state for this updated model
// from the entity change tracker.
const entityChangeState: ChangeState<TEntity> | undefined = this.changeStateMap[entity.id];
// Here, check the entityChangeState and compare it with the original record
...
我的@ngrx/data 用例要求我通过扩展 DefaultDataService<T>
来构建自定义实体数据服务。我正在使用的 API 接受 JSON 更新补丁文件。 EntityCollectionDataService<T>
定义了以下更新函数:
update(update: Update<T>): Observable<T>;
其中 Update<T>
具有类型为 Partial<T>
的成员 changes
。我在这里面临的问题是我无法形成一个 JSON 补丁文档,其中只有一部分已更改的实体字段。我需要实体的未更改和更改状态。
我在这里看到的唯一解决方案是通过 EntityCollectionService
为我的实体访问 EntityChangeTracker
,我对如何使用更改跟踪器有点困惑,因为它是只是通过 EntityCollectionService 的 changeState$
字段可观察到的变化流。
有没有我在这里没有看到的更简单的方法?我还想只访问商店并拉取实体的当前状态,但我更喜欢使用乐观并发,所以当我正在写的 DefaultDataService
被调用时,商店已经改变了更新效果。
事实证明,正如我所料,你可以通过观察EntityChangeTracker中发生的变化来形成补丁文档。只需订阅 changeState$
,检查状态更改是否为更新,然后继续比较原始内容与修改后的内容。
我通过 update
方法在我的数据服务中返回一个 Observable,并检查更新的内容是否在 changeState
地图中有一个键来做到这一点。
update = (entity: Update<TEntity>): Observable<TEntity> => {
/**
* Since we are needing to perform extra logic to
* retrieve an original copy of the modified entity,
* we are returning a new Observable.
*/
return new Observable<TEntity>((subscriber) => {
// Pull the entity change state for this updated model
// from the entity change tracker.
const entityChangeState: ChangeState<TEntity> | undefined = this.changeStateMap[entity.id];
// Here, check the entityChangeState and compare it with the original record
...