8

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

4

4 回答 4

20

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

export const adapter: EntityAdapter<Model> = createEntityAdapter({
  selectId: (model: Model) => model.modelId,
});
于 2018-05-31T13:55:26.977 回答
4

我们需要更新 EntityAdapter 中的 Id,因为 API 返回唯一 ID,以供将来引用,当第一次将其添加到商店时,该 ID 不可用。所以如果你愿意,你可以自己改变它。

const updateSelectedRooms = new selectedRoomsActions.UpdateSelectedRooms(
            {
                entities: [
                    {
                        changes: {
                            id: mockResponse.data.rooms[0].roomId,
                            pricing: mockResponse.data.rooms[0].pricing,
                        },
                        id: '1234-5678',
                    },
                ],
            },
        );
于 2019-05-03T14:17:23.430 回答
0

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

selectId:为集合选择主 id 的方法。当实体的主键为 id 时可选

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

于 2019-12-30T13:47:18.677 回答
0

NGRX 在 entityAdaptor 中引入了该mapOne功能。这可用于通过传递旧 id 来更新具有不同 id 的实体。

定义适配器

const updatesAdapter: EntityAdapter<ModelEntity> = createEntityAdapter<ModelEntity>();

在减速机

...
on(Action.someUpdateAction, (state,
                                 {newEntity, oldId}): State => {
    return updatesAdapter.mapOne({
      id: oldId,
      map: (e: ModelEntity) => ({
        ...newEntity 
      })
    }, state);
  }),
...
于 2021-01-12T13:55:09.447 回答