我有一个(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项目的一部分,值得的。
答案 0 :(得分:1)
一般来说,Redux状态应该完全标准化 - 你不应该在两个地方有一些状态,因为它确实产生了你所看到的问题。
在您的情况下,最好的解决方案可能是selectSpeaker只包含所选扬声器的ID,而不是扬声器本身。例如
之类的东西export const selectedSpeaker = (state: any = [], { type, payload }) => {
switch (type) {
case SelectedSpeakerActions.SELECT:
return payload.id;
}
}
显然,您需要使用ID查找您使用它的所选扬声器。您可能还会发现在扬声器商店中使用id =>扬声器中的对象(或地图)更容易,而不是普通数组。