为什么通常将Ngrx实体ID用作字符串?

时间:2018-06-29 17:41:57

标签: angular ngrx ngrx-store ngrx-entity

我一直在研究为ngrx实体设置样板的示例,并且很好奇为什么大多数人使用字符串类型id来设置其模型。这很奇怪,因为对于EntityState,然后将所选ID存储为数字。在大多数情况下,我看到的示例都使用了此方法,但我一直无法找到一个合理的方法。

这有什么好处?我可能正在考虑使用简单的JSON编码,但这会使正常的操作(如递增索引和查找烦人)。宁愿只在需要导出数据时进行编码。

以下是官方回购示例的链接: https://github.com/ngrx/platform/blob/master/docs/entity/adapter.md

export interface User {
  id: string;
  name: string;
}

export interface State extends EntityState<User> {
  // additional entities state properties
  selectedUserId: number | null;
}

export const initialState: State = adapter.getInitialState({
  // additional entity state properties
  selectedUserId: null,
});

2 个答案:

答案 0 :(得分:1)

我相信在示例中:selectedUserId: number | null;是一个错误,因为他们后来将用户定义为:

export interface User {
  id: string;
  name: string;
}

也就是说,为什么使用字符串而不是数字?

1)我想获得更好的全球支持。如果人们使用ID存储为数字的数据库,那么可以将它们另存为字符串而没有任何问题。但是,如果它是字符串,则将其另存为数字会更加困难...

2)(这里是真正的论点),很多人都在使用UUID直接从前端生成一些ID。它使您可以确保即使从前端生成的ID也将是唯一的*,因此,您可以脱机工作(创建资源并在与后端同步之前仍然可以使用它),否则会很难得多。 / p>

即使您不打算在应用程序中支持脱机模式,我认为还有一个更常见的用例:乐观更新。因此,您将为资源生成一个ID,将资源保存在REDUX存储区中或要保存的任何位置,然后请求将其添加到ex的后端。如果一切都很好,那就好!否则,仅在几秒钟后显示一条消息,说明无法保存该资源,最终建议重试。但是,每次工作正常时,用户都会很高兴与您的应用程序进行即时交互,而不会因为网络而感到任何“滞后”。

*:不是100%保证的,但是,如果您阅读有关UUID的文章,生成已经存在的文章的机会非常非常低。另外,您仍然可以在后端检查一下ID是否不存在等。

答案 1 :(得分:0)

Ngrx 4.1.0起,您就可以使用字符串或数字标识符。

只需声明您的实体适配器,如下所示:

export const adapter: EntityAdapter<MyModel> = createEntityAdapter<MyModel>({
  sortComparer: false,
});

在这种情况下,您应该具有idstring的{​​{1}}属性,例如:

number