redux:如何更新商店中的相关信息

时间:2016-12-05 13:46:58

标签: redux ngrx

我有一个(ngrx)商店用于Speaker对象和SelectedSpeaker的数组。减速器看起来像:

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的reducer看起来像:

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

    switch (type) {

        case SelectedSpeakerActions.SELECT:            
            return payload;
    }  

}

现在我的问题是,如果我为扬声器发送一个SpeakerActions.TOGGLEFAVORITE,这恰好是SelectedSpeaker,在这种情况下如何更新SelectedSpeaker?请注意,这一切都是Angular2项目的一部分,值得的。

1 个答案:

答案 0 :(得分:1)

一般来说,Redux状态应该完全标准化 - 你不应该在两个地方有一些状态,因为它确实产生了你所看到的问题。

在您的情况下,最好的解决方案可能是selectSpeaker只包含所选扬声器的ID,而不是扬声器本身。例如

之类的东西
export const selectedSpeaker = (state: any = [], { type, payload }) => {

    switch (type) {

        case SelectedSpeakerActions.SELECT:            
            return payload.id;
    }  

}

显然,您需要使用ID查找您使用它的所选扬声器。您可能还会发现在扬声器商店中使用id =>扬声器中的对象(或地图)更容易,而不是普通数组。