Ngrx数据选择单个实体

时间:2019-08-30 19:03:49

标签: angular ngrx angular-ngrx-data

我正在使用ngrx-data插件(在ngrx之上运行),并且试图从存储中选择单个实体(ngrx数据称为“缓存”)。我发现可以将单个实体添加到缓存中,但找不到从商店中检索单个项目(基于ID)的方法。

是否需要为此编写自己的选择器?我假设ngrx-data会提供类似这样的简单操作

4 个答案:

答案 0 :(得分:2)

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

就像glitchbane said in his answer一样,该文档仍在开发中,因此我也希望我缺少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));
        }
);

答案 1 :(得分:1)

我肯定有一种更优雅的方法,但是我可以通过使用数据服务上的collection $属性来获得单个实体。

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

当我想使用该ID检索核心时,使用此结构,此处通过将单个实体登录到控制台进行说明:

inflate()

编辑后添加:

您还可以订阅实体服务的entityMap $。我向实体服务中添加了一个名为selectEntityById的方法,该方法可以很好地工作并返回一个可观察的对象,这与之前的代码不同,该代码返回一个实际的对象:

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

}

ngrx / data的文档目前尚不完善,但仍在改进中。我希望有人会尽快对此问题发布更好的答案。

答案 2 :(得分:0)

我们需要某种方式使用

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

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

collectionSelectors.projector ?? `

答案 3 :(得分:0)

我不久前开始使用 Ngrx数据 ...我想您可以通过其他方式创建选择器。

但是,我将说明过去如何处理直接来自我们的模型,缓存等的实体...我正在做的是将服务导入构造函数中

  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 完成排放,因此您只有这个元素。

我希望它可以帮助您或为您提供正确的方向。