我正在使用ngrx-data 插件(在ngrx 之上运行),并且我试图从商店中选择一个实体(ngrx 数据调用'缓存')。我发现您可以将单个实体添加到缓存中,但我找不到从商店中检索单个项目(基于 Id)的方法。
我必须为此编写自己的选择器吗?我假设ngrx-data会提供这样一个简单的操作
我正在使用ngrx-data 插件(在ngrx 之上运行),并且我试图从商店中选择一个实体(ngrx 数据调用'缓存')。我发现您可以将单个实体添加到缓存中,但我找不到从商店中检索单个项目(基于 Id)的方法。
我必须为此编写自己的选择器吗?我假设ngrx-data会提供这样一个简单的操作
我确信有一种更优雅的方法可以做到这一点,但我能够通过使用数据服务上的 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 的文档目前不是很好,但正在改进。我希望有人会尽快发布这个问题的更好答案。
我有同样的问题,得到的结果略有不同。这不一定比其他答案更好,但它的工作方式略有不同。
正如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(分解数组)为每个实体进行发射,使用 take 切割它们并设置您想要的“n”(假设您需要第三个元素,然后是 n="3")并完成最后排放,所以你只有这个元素。
我希望它可以帮助你,或者可以给你正确的方向。
我们需要以某种方式使用它
`构造函数(私有authDataService:AuthDataService,私有authEntityService:AuthEntityService,私有authEntitySelectorFactory:AuthEntitySelectorFactory)
const collectionSelectors = authEntitySelectorFactory.createCollectionSelector('auth');
collectionSelectors.projector ?? `