2016-12-05 3 views
0

У меня есть (ngrx) магазин для массива объекта Speaker и для SelectedSpeaker. Редуктор выглядит так: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 правильно, вы должны использовать идентификатор, который должен быть идентификатором выбранного пользователя. Я сделал тему о ngrx в документации stackoverflow, если вы не знакомы с ngrx, это может помочь :)! http://stackoverflow.com/documentation/angular2/8086/ngrx#t=201612051500428489056 – Maxime

ответ

1

Как правило, состояние Redux должно быть полностью нормализовано - вы не должны иметь какое-либо состояние в двух местах, поскольку оно создает именно ту проблему, которую вы видите.

Возможно, лучшим решением в вашем случае является выбранный динамик, чтобы содержать только идентификатор выбранного динамика, а не самого динамика. например что-то вроде

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

    switch (type) { 

     case SelectedSpeakerActions.SELECT:    
      return payload.id; 
    } 

} 

Очевидно, что вам нужно будет найти выбранный динамик, где вы его используете, используя идентификатор. Вам также может быть проще иметь объект (или карту) от id => динамика в вашем хранилище динамиков, а не простой массив.

+0

ОК, с одной стороны, это имеет смысл. С другой стороны, если я изменяю SelectedSpeaker при использовании объекта динамика, все сразу обновляется без необходимости создавать код для извлечения нового (выбранного) объекта динамика в каждом компоненте, в котором я использую SelectedSpeaker. –

+0

'function getSelectedSpeaker (state) {...}' Только написать функцию один раз, а затем повторно использовать ее там, где она вам нужна. – TomW

Смежные вопросы