Ngrx-данные выбирают одну сущность

Я использую плагин ngrx-data (работает поверх ngrx), и я пытаюсь выбрать одну сущность из хранилища (данные ngrx вызывают "Cache"). Я обнаружил, что вы можете добавить один объект в кеш, но не могу найти способ извлечь один элемент (на основе идентификатора) из хранилища.

Должен ли я написать свой собственный селектор для этого? Я предполагаю, что простая операция, подобная этой, будет предоставлена ​​ngrx-data

0 ответов

Я уверен, что есть более элегантный способ сделать это, но я смог получить единый объект, используя свойство collection $ в службе данных.

например, у меня есть объект под названием Core и EntityService под названием CoreEntityService. Мой кеш сущностей был заполнен через coreEntityService.getByKey(id). Или я мог бы заполнить кеш сущностей с помощью getAll().

когда я хочу получить ядро ​​с этим идентификатором, я использую эту конструкцию, проиллюстрированную здесь путем записи единого объекта в консоль:

this.coreEntityService.collection$.subscribe(collection => console.log(collection.entities[id]))

Отредактировано для добавления:

вы также можете подписаться на entityMap$ службы сущностей. Я добавил в свою службу сущностей метод selectEntityById, подобный этому, который работает хорошо и возвращает наблюдаемый объект, в отличие от предыдущего кода, который возвращает реальный объект:

selectEntityById(coreId: number): Observable<Core> {
return this.entityMap$.pipe(
  map(entities => entities[coreId]),
  first());

}

Документация для ngrx/data на данный момент невелика, но она улучшается. Я надеюсь, что кто-нибудь скоро опубликует лучший ответ на этот вопрос.

У меня был тот же вопрос, но я пришел к несколько иному результату. Это не обязательно лучше, чем другой ответ, но работает он немного по-другому.

Как и сказал в своем ответе glitchbane, документация находится в стадии разработки, поэтому я также надеюсь, что мне не хватает какого-то легкодоступного метода для этого, предоставляемого ngrx-data, но мне еще предстоит его найти.

Я хотел, чтобы моя подписка предоставляла единственный элемент, который я искал, а не использовала idдля выбора элемента внутри подписки. Это привело меня к созданию селектора.

Импорт и селектор:

import { createSelector } from '@ngrx/store';
import { EntityCollection } from '@ngrx/data';
import { MyModel } from '....my.model';

export const selectMyModels =
    (entities: EntityCollection<MyModel>) => entities.entities;

export const selectMyModelById = (id: number) => createSelector(
    selectMyModels,
    entities => entities[id]
);

Пример использования:

this.myModelEntityCollectionService.collection$.pipe(
    select(selectMyModelById(1)))                    // <-- used here
        .subscribe((myModel: MyModel) => {
            this.myLogger.log(JSON.stringify(myModel));
        }
);

Я начал использовать Ngrx-data не так давно... Я предполагал, что вы можете создавать селекторы другими способами.

Однако я объясню, как я делал это для сущностей, поступающих непосредственно из нашей модели, кеша и т. Д.... То, что я делаю, это импортирую службу в конструктор

  constructor(private myModelsService: myModelEntityService) { } 

А затем, например, получение всех сущностей с помощью

ngOnInit(){
    this.entities$ = this.myModelsService.entities$;
}

Наконец, чтобы решить вашу проблему, нужно просто взять сохраненную сущность из вашего магазина или как то же самое спасение от наблюдаемых сущностей; Я бы поймал сущность, как показано ниже

this.myEntity$ = this.myModelsService.entities$.pipe(mergeAll(), take(n), last())

В принципе, ваш делает эмиссию для каждого лица с mergeAll (разлагающего массив), вырезая их с взятием и установив "N", что вы хотите (скажем, вам нужен третий элемент, то п ="3") и завершив выбросы с последним, так что у вас есть только этот элемент.

Я надеюсь, что это поможет вам или может указать правильное направление.

Нам нужно как-то использовать это

`конструктор (частный authDataService: AuthDataService, частный authEntityService: AuthEntityService, частный authEntitySelectorFactory: AuthEntitySelectorFactory)

const collectionSelectors = authEntitySelectorFactory.createCollectionSelector('auth');

collectionSelectors.projector??`

Другие вопросы по тегам