Как динамически запрашивать сущности из хранилища сущностей Акиты - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть такая сущность

interface IDevice {
  id: string;
  name: string;
  brand: string;
  plan: 'contract' | 'unlocked';
}

и хранилище сущностей

interface DevicesState extends EntityState<IDevice> {
  selectedBrand: string | undefined;
  selectedPlan: 'contract' | 'unlocked';
}

И я хочу запросить и отфильтровать сущности по выбранному бренду.

Моя единственная попытка была

  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$ является наблюдаемой. Как выбрать устройства на основе двух значений внешнего состояния?

Попытка вторая: как предложено @sroes внизу, я использовал switchMap и добавил forkJoin, чтобы объединить два наблюдаемых. Но, похоже, это совсем не работает.

  devices$ = forkJoin([this.selectedBrand$, this.selectedPlan$])
    .pipe(
      switchMap(([brand, plan]) => brand
        ? this.selectAll({
          filterBy: [
            entity => entity.categories.map(x => x.name).includes(brand),
            entity => entity.plan_tab === plan
          ]
        })
        : this.selectMany([]))
    );

1 Ответ

1 голос
/ 29 апреля 2020

Вы можете использовать switchMap , чтобы сначала наблюдать выбранную марку, а затем переключиться на выбор магазина в зависимости от выбранной марки:

selectedBrand$ = this.select('selectedBrand');
devices$ = this.selectedBrand$
  .pipe(
      switchMap(brand => brand 
          ? this.selectAll({
                filterBy: entity => entity.brand === brand
          }) 
          : this.selectMany([])
      )
  );

Когда вы хотите объединить две наблюдаемые, вы можно использовать 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)
      })
    );
...