Ngrx-data select 单个实体

Ngrx-data select a single entity

我正在使用 ngrx-data 插件(在 ngrx 之上运行),我正在尝试 select 商店中的单个实体(ngrx 数据调用 'Cache')。我发现您可以将单个实体添加到缓存中,但我找不到从商店中检索单个项目(基于 Id)的方法。

我是否必须自己编写 select 或者为此? 我假设 ngrx-data[=11= 会提供像这样的简单操作]

我确信有一种更优雅的方法可以做到这一点,但我能够通过在数据服务上使用集合 $ 属性 来获得单个实体。

例如,我有一个名为 Core 的实体和一个名为 CoreEntityService 的 EntityService。我的实体缓存已通过 coreEntityService.getByKey(id) 填充。或者我可以通过 getAll().

填充实体缓存

当我想检索具有该 ID 的核心时,我使用此构造,此处通过将单个实体记录到控制台来说明:

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

编辑添加:

您还可以订阅实体服务的entityMap$。我向我的实体服务添加了一个名为 selectEntityById 的方法,它运行良好并且 returns 是一个可观察对象,与之前的代码不同,后者 returns 是一个实际对象:

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

ngrx/data 的文档目前不是很好,但正在改进。我希望很快会有人 post 更好地回答这个问题。

我们需要以某种方式使用这个

` 构造函数(私有 authDataService:AuthDataService, 私有 authEntityService:AuthEntityService, 私人 authEntitySelectorFactory: AuthEntitySelectorFactory)

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

collectionSelectors.projector ?? `

我有同样的问题,但得出的结果略有不同。这不一定比其他答案好,但它的工作方式略有不同。

正如 glitchbane 一样,该文档是一项正在进行的工作,所以我也希望我缺少一些由 ngrx-data 提供的现成可用的方法来执行此操作,但我还没有找到一个。

我希望我的订阅提供我正在寻找的单个元素,而不是使用 id 到 select 订阅中的元素。这导致我创建了一个 selector.

导入和选择器:

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(分解数组)对每个实体进行发射,使用 take 切割它们并设置"n" 你想要的(假设你需要第三个元素,然后是 n="3")并用 last 完成排放,所以你只有这个元素。

希望对您有所帮助,或者给您指明正确的方向。