在ngrx/entities中更改id是否可能?

9

在ngrx/entities中,是否有必要使用不会更改的id?我想使用字符串属性path作为id,它是唯一的。但它可能会被更改。在这种情况下,我应该使用uuid作为id吗?


请发布一些代码。您的简单问题不清楚。 - user6749601
你可以使用任何唯一标识符作为ID,但问题仍然不清楚。 - m.akbari
4个回答

25

您可以传递一个函数来覆盖创建适配器时默认的id选择:

export const adapter: EntityAdapter<Model> = createEntityAdapter({
  selectId: (model: Model) => model.modelId,
});

2
这个回答并没有回答被问到的问题。问题是要求如何更新现有实体的ID,而不是如何指定自定义ID。 - Shane Loveland

4

我们需要更新EntityAdapter中的Ids,因为API返回唯一ID以供将来参考,而在首次添加到存储时不可用。因此,如果您愿意,可以自行更改它。

const updateSelectedRooms = new selectedRoomsActions.UpdateSelectedRooms(
            {
                entities: [
                    {
                        changes: {
                            id: mockResponse.data.rooms[0].roomId,
                            pricing: mockResponse.data.rooms[0].pricing,
                        },
                        id: '1234-5678',
                    },
                ],
            },
        );

1
NGRX在entityAdaptor中引入了mapOne函数。可以通过传递旧的id来使用它来更新具有不同id的实体。
定义适配器。
const updatesAdapter: EntityAdapter<ModelEntity> = createEntityAdapter<ModelEntity>();

在 reducer 中
...
on(Action.someUpdateAction, (state,
                                 {newEntity, oldId}): State => {
    return updatesAdapter.mapOne({
      id: oldId,
      map: (e: ModelEntity) => ({
        ...newEntity 
      })
    }, state);
  }),
...

这将在路径末尾添加路径,而不是更新它所在的位置。 - Charlie-Greenman

0
根据实体适配器的官方文档:

我认为它将解决与实体ID相关的问题。您还可以尝试使用实体适配器来执行任何想要在实体上执行的功能,而且更进一步的是,您应该尝试@ngrx/data


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接