如何从秋田实体商店动态查询实体

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)
      })
    );