2016-12-05 20 views
0

Speakerオブジェクトの配列とSelectedSpeakerの(ngrx)ストアがあります。減速機は次のようになります:redux:店舗内の関連情報を更新する方法

export const speakers = (state: any = [], { type, payload }) => { 

    switch (type) { 

     case SpeakerActions.TOGGLEFAVORITE: 
      return state.map(speaker => { 
      return speaker.id === payload.id ? _.assign({}, speaker, {isFavorite: !speaker.isFavorite}) : speaker; 
      }); 

    } 

} 

私は重要ではないコードを削除しました。 currentSpeakerための減速は次のようになります。

export const selectedSpeaker = (state: any = [], { type, payload }) => { 

    switch (type) { 

     case SelectedSpeakerActions.SELECT:    
      return payload; 
    } 

} 

私はスピーカー用のSpeakerActions.TOGGLEFAVORITEを派遣し、これはSelectedSpeakerであることを起こる場合は今、私の質問は、どのように私はこのケースでSelectedSpeakerを更新していますか?これはすべてAngular2プロジェクトの一部として機能していることに注意してください。

+1

@TomWが正しい場合は、選択したユーザーのIDであるidを使用する必要があります。私はstackoverflowのドキュメントでngrxについての話題を作っています。ngrxになじみのない人なら、それは役に立ちます:) http://stackoverflow.com/documentation/angular2/8086/ngrx#t=201612051500428489056 – Maxime

答えて

1

一般に、Redux状態は完全に正規化する必要があります。表示されている問題を正確に作成するため、2つの状態で状態を持つべきではありません。

おそらく、あなたのケースでは、選択されたスピーカーのIDはスピーカー自体ではなく、選択されたスピーカーのための最良の解決策です。例えば

export const selectedSpeaker = (state: any = [], { type, payload }) => { 

    switch (type) { 

     case SelectedSpeakerActions.SELECT:    
      return payload.id; 
    } 

} 

明らかに、使用する場所でIDを使用して、選択したスピーカーをルックアップする必要があります。また、単純な配列ではなく、スピーカーストア内のid => speakerからオブジェクト(またはMap)を持つほうが簡単かもしれません。

+0

OK、一方でこれは理にかなっています。一方、スピーカーオブジェクトを使用するときにSelectedSpeakerを変更すると、SelectedSpeakerを使用するすべてのコンポーネントで新しい(選択された)スピーカーオブジェクトを取得するコードを作成する必要なく、すべてが直ちに更新されます。 –

+0

'function getSelectedSpeaker(state){...}'関数を一度しか書いておきません。 – TomW

関連する問題