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 完成排放,所以你只有这个元素。
希望对您有所帮助,或者给您指明正确的方向。
我正在使用 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
我希望我的订阅提供我正在寻找的单个元素,而不是使用 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 完成排放,所以你只有这个元素。
希望对您有所帮助,或者给您指明正确的方向。