как исправить проблему, когда объект ngrx возвращал неопределенное значение для идентификатора

почему я получаю эту ошибку ниже и как это исправить.

Сущность, переданная реализации selectId, вернулась неопределенной. Вероятно, вам следует предоставить собственную реализацию selectId. Объект, который был передан:


person Amit Dubey    schedule 23.04.2019    source источник


Ответы (3)


Вероятно, вы передаете объект, у которого нет свойства id. Поэтому вам нужно переопределить метод selectId в создании EntityAdapter.

export const adapter: EntityAdapter<YourInterface> =
  createEntityAdapter<YourInterface>({
    selectId: nameofclass => nameofclass.yourID
  });
person Miguel Angel Magaña    schedule 06.06.2019
comment
Куда это идет? Я пытался добавить его, но он не попадает в него. - person Godrules500; 02.04.2020
comment
Это происходит при инициализации адаптера для этого конкретного объекта @Godrules500. - person Miguel Angel Magaña; 06.04.2020

Я исправил эту проблему, указав метаданные для нескольких сущностей одновременно в EntityMetadataMap:

// entity-store.module.ts

...

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

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

...
person Milena    schedule 04.01.2020

Эта ошибка обычно связана с отсутствием первичного ключа объекта:

Каждый тип сущности должен иметь первичный ключ, значением которого является целое число или строка. Библиотека данных NgRx предполагает, что сущность имеет свойство «id», значение которого является первичным ключом.

Не каждый объект будет иметь свойство первичного ключа с именем «id». Для некоторых сущностей первичный ключ может иметь любое имя или может быть комбинированным значением двух или более свойств. В этих случаях вы всегда указываете первичный ключ для этой сущности с помощью функции:

selectId

Эта функция возвращает значение первичного ключа указанного поля/свойства этого объекта.

Например:

Entity Villain не имеет первичного ключа с именем «id», но он называется «key». Для этого объекта функция selectId выглядит следующим образом:

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

И полное объявление метаданных объекта может быть примерно таким:

Файл: ../entity-store.module.ts

const entityMetadata: EntityMetadataMap = {

    ...

    Villain: {
                       // We MUST specify a primary key / id field for each entity
                       // (if it does not have its own prop/field named: 'id') !!!
        selectId: (villain: Villain) => villain.key, // <--- 

                       // optional setting - filter
        filterFn: filterForVillains,
                       // optional setting - sort order
        sortComparer: sortVillains
    },

    Hero { ... },

    ....

}
person Felix    schedule 08.06.2020