Angular SignalStore -> 2 个数组

问题描述 投票:0回答:1

我有一个包含 2 个数组和 2 个 API 调用的 SignalStore。我可以将 2 个数组合并为 1 个数组并获取数据吗?这样我就可以使用PVVormat.[0]。和 PVVormonat。[1]来自 2 个 API 调用的数据?

export const AktuellerMonatStore = signalStore(
  withState(monatGesamt),
  withRequestStatus(),
  withMethods((store, dbService = inject(DBService)) => ({
    loadDaten: rxMethod<void>(
      pipe(
        switchMap(() => {
          patchState(store, setPending());
          return dbService.getMonatGesamt('' + aktJahr + '', '' + monat + '').pipe(
            tapResponse({
              next: (pvVorjahr) =>
                patchState(store, { pvVorjahr }, setFulFilled()),
              error: (error: {message:string}) => {
                patchState(store, setError(error.message));
              }
            })
          )
        })
      )
    ),
    loadDatenVorjahr: rxMethod<void>(
      pipe(
        switchMap(() => {
          patchState(store, setPending());
          return dbService.getMonatGesamt('' + aktJahr + '', '' + monat + '').pipe(
            tapResponse({
              next: (pvVormonat) =>
                patchState(store, { pvVormonat }, setFulFilled()),
              error: (error: {message:string}) => {
                patchState(store, setError(error.message));
              }
            })
          )
        })
      )
    )
  }))

谢谢

angular signals
1个回答
0
投票

您应该创建一个包含实体的商店,请参阅 Medium 上的这篇文章

您的商店应如下所示:

export interface IItem {
    id: number, 
    name: string
}


export const ItemsStore = signalStore(
        // {providedIn: 'root'},
        withState({isLoading: false}),
        withEntities({entity: type<IItem>(), collection: 'collection1'}),
        withEntities({entity: type<IItem>(), collection: 'collection2'}),

        withComputed((store) => ({
            getCollection1AndCollection2: computed(() => {
                return [...store.collection1Entities(), ...store.collection2Entities()];
            }),
        })),
        withMethods((store, dataService = inject(DataService)) => ({
            getCollection1: rxMethod<void>(
                pipe(
                    tap(() => patchState(store, {isLoading: true})),
                    switchMap( () => {
                        return dataService.getCollection1FromServer().pipe(
                            tapResponse({
                                next: (items: IItem[]) => {
                                    patchState(store, setEntities(items, {collection: 'collection1'}))
                                },
                                error: console.error,
                                finalize: () => patchState(store, {isLoading: false}),
                            })
                        )
                    })
                )
            ),
            getCollection2: rxMethod<void>(
                pipe(
                    tap(() => patchState(store, {isLoading: true})),
                    switchMap(book => {
                        return dataService.getCollection2FromServer().pipe(
                            tapResponse({
                                next: (items: IItem[]) => {
                                    patchState(store, setEntities(items, {collection: 'collection2'}))
                                },
                                error: console.error,
                                finalize: () => patchState(store, {isLoading: false}),
                            })
                        )
                    })
                )
            ),
        }))
    );

然后您可以在组件或其他任何地方使用它:

@Component(...)
export class AComponent {
   private itemsStore = inject(ItemsStore);

   listOfAllItems: Item[] = this.itemsStore.getCollection1AndCollection2();
}
© www.soinside.com 2019 - 2024. All rights reserved.