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??`