NgRxストア-別の状態オブジェクトのプロパティに基づいて条件付きでデータをロードする

DJC

シーズンIDに基づいてAPIからフィクスチャ、結果などをレンダリングするアプリがあります-このIDはSeasonStateのプロパティとして状態に保存されます:

export interface SeasonsState extends EntityState<Season> {
  allSeasonsLoaded: boolean;
  currentlySelectedSeasonId: number;
}

これは、APIからフェッチして状態に保存するフィクスチャ、結果などを決定するために他のコンポーネントによって使用されます。例えば:

this.store
    .pipe(
        select(selectCurrentlySelectedSeason)
    ).subscribe(seasonId => {
  this.store.dispatch(new AllFixturesBySeasonRequested({seasonId}));
  this.fixtures$ = this.store
      .pipe(
          select(selectAllFixturesFromSeason(seasonId))
      );
});

これはうまく機能しますが、私が本当に望んでいるのは、特定のシーズンのフィクスチャがまだ状態に保存されていない状態で、フィクスチャのみをフェッチできるようにすることです。

エフェクトでAPIからデータを条件付きでロードするために使用するセレクターを作成しようとしました。

export const selectSeasonsLoaded = (seasonId: any) => createSelector(
    selectFixturesState,
    fixturesState => fixturesState.seasonsLoaded.find(seasonId)
);

しかし、これを実装する方法/これが正しいアプローチであるかどうかはわかりません。

編集:以下の回答からの情報を使用して、私は次の効果を書きました、しかしコメントを見てください-私は私のwithLatestFromのペイロードからseasonIdを使用できる必要があります。

@Effect()
loadFixturesBySeason$ = this.actions$
  .pipe(
      ofType<AllFixturesBySeasonRequested>(FixtureActionTypes.AllFixturesBySeasonRequested),
      withLatestFrom(this.store.select(selectAllFixtures)), // needs to be bySeasonId
      switchMap(([action, fixtures]) => {
          if (fixtures.length) {
              return [];
          }
          return this.fixtureService.getFixturesBySeason(action.payload.seasonId);
      }),
      map(fixtures => new AllFixturesBySeasonLoaded({fixtures}))
  );
user2216584

エフェクトを次のように設定します[私はngrx6を使用しているので、ngrx6でテストしました。他のバージョンを使用している場合は、アイデアを得て、それに応じてコードを調整します]-

@Effect() allFixturesBySeasonRequested: Observable<Action> =
  this._actions$
      .pipe(
          //Please use your action here;
          ofType(actions.AllFixturesBySeasonRequested),
          //please adjust your action payload here as per your code
          //bottom line is to map your dispatched action to the action's payload
          map(action => action.payload ),
          switchMap(seasonId => {
              //first get the fixtures for the seasonId from the store
              //check its value if there are fixtures for the specified seasonId
              //then dont fetch it from the server; If NO fixtures then fetch the same from the server
              return this.store
                        .pipe(
                            select(selectAllFixturesFromSeason(seasonId)),
                            //this will ensure not to trigger this again when you update the fixtures in your store after fetching from the backend.
                            take(1),
                            mergeMap(fixtures => {
                                //check here if fixtures has something OR have your logic to know
                                //if fixtures are there
                                //I am assuming it is an array
                                if (fixtures && fixtures.lenght) {
                                    //here you can either return NO action or return an action
                                    //which informs that fixtures already there
                                    //or send action as per your app logic
                                    return [];
                                } else {
                                    //NO fixtures in the store for seasonId; get it from there server
                                    return this.http.get(/*your URL to get the fixtures from the backend*/)=
                                               .pipe(
                                                   mergeMap(res => {
                                                        return [new YourFixtureFetchedSucccess()];
                                                    }
                                                   )
                                               )
                                }
                            })
                        );
          })
      )

次に、指定したseasonIdのフィクスチャをサービス/コンポーネントまたはアプリの設計方法からフェッチするアクションをディスパッチする必要があります。

それがあなたにアイデアを与え、あなたの問題を解決するのに役立つことを願っています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ソースオブジェクトのプロパティに基づいて条件付きでclassNameを割り当てます

分類Dev

F#はオブジェクトのシーケンスを繰り返し、プロパティに基づいて条件付きで集計します

分類Dev

別のプロパティの値に基づいてスキーマオブジェクトのタイプを設定する方法は?

分類Dev

プロパティに基づいてC#リストオブジェクトを条件付きでシリアル化する方法はありますか?

分類Dev

別のオブジェクトのプロパティに基づいてオブジェクトのプロパティを入力する(Typescript内)

分類Dev

条件付きで1つのオブジェクトから別のオブジェクトにプロパティをコピーする

分類Dev

プロパティに基づいて、リストオブジェクトをあるリストから別のリストにコピーします

分類Dev

ソースオブジェクトに特定の値を持つ深くネストされたプロパティがあるかどうかに基づいて条件付きでJSX要素をレンダリングする

分類Dev

2つのプロパティに基づいてオブジェクトのキーを検索する

分類Dev

条件に基づいて、オブジェクトの配列のプロパティを合計する方法

分類Dev

C#のプロパティに基づいてオブジェクトのリストからマージされたデータを取得します

分類Dev

日付プロパティ(文字列型)に基づいてオブジェクトのリストをソートする際の例外

分類Dev

Swift iOS - 個々のオブジェクトの配列を類似のプロパティに基づいて個別の配列にソートする方法

分類Dev

複数のオブジェクトプロパティに基づいて配列内のオブジェクトを条件付きで削除するにはどうすればよいですか?

分類Dev

jqを使用して、オブジェクトのJSONストリームをオブジェクトプロパティの値に基づいて個別のファイルに分割するにはどうすればよいですか?

分類Dev

オブジェクトのプロパティに基づいてリストのリストを作成するコレクター

分類Dev

他のプロパティに基づいてオブジェクトリテラルでオブジェクトプロパティを計算する方法

分類Dev

他のプロパティに基づいてオブジェクトのいくつかのプロパティをグループ化する方法

分類Dev

別の値に基づく複数のオブジェクトタイプを持つコード化可能なデコードプロパティ

分類Dev

オブジェクトのプロパティに基づいて動的コンポーネントをロードする方法は?

分類Dev

オブジェクトのプロパティに基づいてボタンを無効にする

分類Dev

プロパティに基づいて配列内のオブジェクトをマージします

分類Dev

JS-1つのプロパティの重複についてオブジェクトの配列をフィルタリングし、別のプロパティに基づいて保持するオブジェクトを決定します

分類Dev

javascriptの条件に基づいてオブジェクトのプロパティにプロパティを追加する方法は?

分類Dev

データのプロパティ値に基づいて、Json.Netを使用して逆シリアル化するオブジェクトタイプを選択するにはどうすればよいですか?

分類Dev

Kotlinの特定のプロパティに基づいてカスタムオブジェクトのArraylistでインデックスを見つける方法は?

分類Dev

プロパティの日付に基づいてオブジェクトのリストを並べ替えるsudoオブジェクトの値

分類Dev

プロパティに基づいてオブジェクトのリストを分割するc#

分類Dev

データベースへのアップロード中に非オブジェクトのプロパティを取得しようとしています

Related 関連記事

  1. 1

    ソースオブジェクトのプロパティに基づいて条件付きでclassNameを割り当てます

  2. 2

    F#はオブジェクトのシーケンスを繰り返し、プロパティに基づいて条件付きで集計します

  3. 3

    別のプロパティの値に基づいてスキーマオブジェクトのタイプを設定する方法は?

  4. 4

    プロパティに基づいてC#リストオブジェクトを条件付きでシリアル化する方法はありますか?

  5. 5

    別のオブジェクトのプロパティに基づいてオブジェクトのプロパティを入力する(Typescript内)

  6. 6

    条件付きで1つのオブジェクトから別のオブジェクトにプロパティをコピーする

  7. 7

    プロパティに基づいて、リストオブジェクトをあるリストから別のリストにコピーします

  8. 8

    ソースオブジェクトに特定の値を持つ深くネストされたプロパティがあるかどうかに基づいて条件付きでJSX要素をレンダリングする

  9. 9

    2つのプロパティに基づいてオブジェクトのキーを検索する

  10. 10

    条件に基づいて、オブジェクトの配列のプロパティを合計する方法

  11. 11

    C#のプロパティに基づいてオブジェクトのリストからマージされたデータを取得します

  12. 12

    日付プロパティ(文字列型)に基づいてオブジェクトのリストをソートする際の例外

  13. 13

    Swift iOS - 個々のオブジェクトの配列を類似のプロパティに基づいて個別の配列にソートする方法

  14. 14

    複数のオブジェクトプロパティに基づいて配列内のオブジェクトを条件付きで削除するにはどうすればよいですか?

  15. 15

    jqを使用して、オブジェクトのJSONストリームをオブジェクトプロパティの値に基づいて個別のファイルに分割するにはどうすればよいですか?

  16. 16

    オブジェクトのプロパティに基づいてリストのリストを作成するコレクター

  17. 17

    他のプロパティに基づいてオブジェクトリテラルでオブジェクトプロパティを計算する方法

  18. 18

    他のプロパティに基づいてオブジェクトのいくつかのプロパティをグループ化する方法

  19. 19

    別の値に基づく複数のオブジェクトタイプを持つコード化可能なデコードプロパティ

  20. 20

    オブジェクトのプロパティに基づいて動的コンポーネントをロードする方法は?

  21. 21

    オブジェクトのプロパティに基づいてボタンを無効にする

  22. 22

    プロパティに基づいて配列内のオブジェクトをマージします

  23. 23

    JS-1つのプロパティの重複についてオブジェクトの配列をフィルタリングし、別のプロパティに基づいて保持するオブジェクトを決定します

  24. 24

    javascriptの条件に基づいてオブジェクトのプロパティにプロパティを追加する方法は?

  25. 25

    データのプロパティ値に基づいて、Json.Netを使用して逆シリアル化するオブジェクトタイプを選択するにはどうすればよいですか?

  26. 26

    Kotlinの特定のプロパティに基づいてカスタムオブジェクトのArraylistでインデックスを見つける方法は?

  27. 27

    プロパティの日付に基づいてオブジェクトのリストを並べ替えるsudoオブジェクトの値

  28. 28

    プロパティに基づいてオブジェクトのリストを分割するc#

  29. 29

    データベースへのアップロード中に非オブジェクトのプロパティを取得しようとしています

ホットタグ

アーカイブ