5

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

我必须为此编写自己的选择器吗?我假设ngrx-data会提供这样一个简单的操作

4

4 回答 4

7

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

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

当我想用那个 id 检索核心时,我使用这个构造,这里通过将单个实体记录到控制台来说明:

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

编辑添加:

您还可以订阅实体服务的 entityMap$。我在我的实体服务中添加了一个名为 selectEntityById 的方法,它运行良好并返回一个 observable,与前面的代码不同,它返回一个实际对象:

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

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

于 2019-09-18T15:05:08.470 回答
2

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

正如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));
        }
);
于 2020-01-31T22:46:30.367 回答
1

我不久前开始使用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")并完成最后排放,所以你只有这个元素。

我希望它可以帮助你,或者可以给你正确的方向。

于 2020-04-02T17:35:26.837 回答
0

我们需要以某种方式使用它

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

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

collectionSelectors.projector ?? `

于 2019-10-02T19:39:09.877 回答