当ngrx实体返回ID的undefined时如何解决问题

时间:2019-04-23 16:16:01

标签: ngrx-entity

为什么出现以下错误以及如何解决。

传递给selectId实现的实体未定义。您可能应该提供自己的selectId实现。传递的实体:

3 个答案:

答案 0 :(得分:1)

可能您正在传递没有id属性的实体。因此,您需要在selectId创建过程中覆盖EntityAdapter方法。

export const adapter: EntityAdapter<YourInterface> =
  createEntityAdapter<YourInterface>({
    selectId: nameofclass => nameofclass.yourID
  });

答案 1 :(得分:1)

我通过在EntityMetadataMap中同时为多个实体指定元数据来解决此问题:

// entity-store.module.ts

...

export function selectEventId(event: Event): number {
  return event.eventId;
}

export const entityMetadata: EntityMetadataMap = {
  User: {},
  Event: {
    selectId: selectEventId
  }
};

...

答案 2 :(得分:1)

此错误通常与丢失-实体主键

有关

每个实体类型必须有一个主键,其值是整数或字符串。 NgRx数据库假定该实体具有“ id”属性,其值为主键。

并非每个实体都具有名为“ id”的主键属性。 对于某些实体,主键可以具有任何名称,也可以是两个或多个属性的组合值。在这些情况下,请始终使用以下功能为该实体指定主键:

selectId

此函数返回该实体的指定字段/属性的主键值。

例如:

实体反派没有主键“ id”,但名为“ key”。 对于这个实体, selectId 函数是这样的:

public class GuildMemberLeave extends ListenerAdapter {
    public void onGuildMemberLeave(GuildMemberLeaveEvent event) {
        EmbedBuilder join = new EmbedBuilder();
        TextChannel spamChannel = event.getGuild().getTextChannelById("713429117546135572");

        join.setColor(Color.getHSBColor(227, 74, 64));
        join.setTitle("SERVER UPDATE");
        join.setDescription(event.getMember().getAsMention() + " has now left the server!");
        spamChannel.sendMessage(join.build()).queue();
    }

实体元数据的完整声明可能类似于:

文件:../ entity-store.module.ts

selectId: (villain: Villain) => villain.key;