2017-08-02 14 views
2

アイテムが店舗にない場合には、そのアイテムを取得する最も良い方法は何かを判断しようとしています。ストアにないアイテムがある場合は、それを取得するアクションをディスパッチしてください。

たとえば、ユーザーの一覧があり、特定のユーザーを取得したいとします。そのユーザーが店舗にいない場合、私は彼をDBからフェッチしたい。

このコードは、以下のベストプラクティスと見なされますか、そうするのがより良い方法ですか?

const searchedUserId = 'abcdefg'; 
this.selecedUser$ = this.store.select(state => { 
    const selectedUserIndex = state.userList.findIndex(searchedUserId) 
    if (selectedUserIndex === -1) { 
    this.store.dispatch(new UsersActions.FetchUsers(searchedUserId)); 
    } else { 
    return state.userList[selectedUserIndex] 
    } 
}) 
+0

ストアは、アプリケーション内の唯一のデータソースである必要があります。したがって、ユーザーが店舗にいない場合は、データを取得してStoreを更新するアクションをディスパッチしてから、ストアからデータを取得する必要があります。 –

+0

しかし、ユーザーを取得するために、私は店に耳を傾ける必要があります。 セレクタの内部でのみ、そのチェックを行うことができます。 – doron

答えて

0

selectorを作成して、ストアからデータを取得します。あなたのコンポーネントで

Creating a selector

は、あなたは状態にsubscribeにする必要があります。

store.select(selectFeatureState).subscribe(state => { 
    //Search for the user in the state. 
    // If user is not there then dispatch the action 
    store.dispatch(ACTION); 
}); 

次に、作成Effects使っ@ ngrx /効果

create effects

効果は、アクションをリッスンし、データを取得し、ストアを更新、サービスを呼び出します。

ストアは既にストアを購読しているため、コンポーネントを更新します。

+0

店舗/効果の仕組みを理解しています。私は、あなたが実際に書いたコードもベストプラクティスとみなされているかどうかを尋ねました。 – doron

0

ガードが必要です。

  1. そのルートのガードを定義し、CanActivate
  2. にガードで
  3. をそれを置く、と、そのLoadUserDetailsAction(USERID)
  4. を派遣(IDが含まれている)ユーザーの詳細コンポーネントのルートを定義しますあなたのコンポーネントを示すことができるように、アクション解決さは(ガードが詳細はロードされている店舗をリッスン)trueを返す
  5. そのyoirコンポーネントにstore.select(userdetails)を行うことになりました安全
+0

ガードは、私が上記で尋ねたものよりもさらに悪い習慣です。ガードはあなたがページにアクセスするのを防ぎ、より多くのデータを読み込まないようにするべきです。私がこのアプローチを望むなら、私はただ解決メソッドを使うことができます。 – doron

+0

誰もガードがあなた以外のデータを読み込んでいないと言っています:)。 Guardは、意図したものを正確に実行します。準備が整っていないコンポーネントをアクティブにしないようにします。 1つのデータを読み込まない。 resolveメソッドをstateと一緒に使用するあなたの考えは、状態管理が意図するものとは正反対のことをしているので、かなり奇妙です。アプリケーションの真実の単一のソースです。しかし、あなたがそれを良い練習として考えるなら、誰が私を止めるのですか) –

+0

まずはあなたの助けに感謝します。しかし、この問題で私はまだガウルスは正しい解決策ではないと思います。私はこのアプローチで解決策がより良い方法になることを肯定的です。しかし、とにかくそれは私が必要なものをカバーしていない – doron

関連する問題