如何从秋田实体商店动态查询实体
How to dynamically query entities from an akita entity store
我有一个这样的实体
interface IDevice {
id: string;
name: string;
brand: string;
plan: 'contract' | 'unlocked';
}
和一家实体店
interface DevicesState extends EntityState<IDevice> {
selectedBrand: string | undefined;
selectedPlan: 'contract' | 'unlocked';
}
我想根据品牌 [=24=]ed.
查询和过滤实体
我唯一的尝试就是这个
selectedBrand$ = this.select('selectedBrand');
selectedPlan$ = this.select('selectedPlan');
devices$ = this.selectedBrand$
? this.selectAll({
filterBy: [
entity => entity.brand === this.selectedBrand$,
entity => entity.plan === this.selectedPlan$,
]
})
: this.selectMany([]);
这将不起作用,因为 this.selectedBrand$
是可观察的。我如何 select 基于两个外部状态值的设备?
可以使用switchMap先观察selected品牌,然后根据selected品牌切换到店铺select:
selectedBrand$ = this.select('selectedBrand');
devices$ = this.selectedBrand$
.pipe(
switchMap(brand => brand
? this.selectAll({
filterBy: entity => entity.brand === brand
})
: this.selectMany([])
)
);
当你想合并两个observables时,你可以使用combineLatest
:
devices$ = combineLatest(this.selectedBrand$, this.selectedPlan$)
.pipe(
switchMap(([brand, plan]) => this.selectAll({
filterBy: [
brand ? entity => entity.categories.map(x => x.name).includes(brand) : null,
plan ? entity => entity.plan_tab === plan : null
].filter(x => x !== null)
})
);
我有一个这样的实体
interface IDevice {
id: string;
name: string;
brand: string;
plan: 'contract' | 'unlocked';
}
和一家实体店
interface DevicesState extends EntityState<IDevice> {
selectedBrand: string | undefined;
selectedPlan: 'contract' | 'unlocked';
}
我想根据品牌 [=24=]ed.
查询和过滤实体我唯一的尝试就是这个
selectedBrand$ = this.select('selectedBrand');
selectedPlan$ = this.select('selectedPlan');
devices$ = this.selectedBrand$
? this.selectAll({
filterBy: [
entity => entity.brand === this.selectedBrand$,
entity => entity.plan === this.selectedPlan$,
]
})
: this.selectMany([]);
这将不起作用,因为 this.selectedBrand$
是可观察的。我如何 select 基于两个外部状态值的设备?
可以使用switchMap先观察selected品牌,然后根据selected品牌切换到店铺select:
selectedBrand$ = this.select('selectedBrand');
devices$ = this.selectedBrand$
.pipe(
switchMap(brand => brand
? this.selectAll({
filterBy: entity => entity.brand === brand
})
: this.selectMany([])
)
);
当你想合并两个observables时,你可以使用combineLatest
:
devices$ = combineLatest(this.selectedBrand$, this.selectedPlan$)
.pipe(
switchMap(([brand, plan]) => this.selectAll({
filterBy: [
brand ? entity => entity.categories.map(x => x.name).includes(brand) : null,
plan ? entity => entity.plan_tab === plan : null
].filter(x => x !== null)
})
);