угловой элемент массива обновления хранилища ngrx, если идентификатор совпадает

#angular #typescript #ngrx #store

Вопрос:

У меня множество звонков. У них разные ключевые слова, а у вызова есть идентификатор call_id. Массив пуст в начале. Если массив пуст или нет вызова с идентификатором входящего вызова, то он должен добавить вызов в массив вызовов в состоянии. В противном случае, когда массив в состоянии имеет вызов с входящим идентификатором, он обновит соответствующий вызов. Теперь initialState.calls[] по-прежнему пуст

  export interface Call {
  timestamp: number;
  call_id: string;
  keywords: Keyword[];
}

 export const initialState: KeywordsModel = {
   version: '',
   calls: [],
   isOpen: false,
   lastUpdatedOn: Date.now()
 };

 export const reducer = createReducer(
   initialState,
   on(KeywordsWebSocketActions.messageReceived, (state, { message, timeReceived }) => ({
     ...state,
     ...message,
     lastUpdatedOn: timeReceived
   })),
   on(KeywordsWebSocketActions.keywordsPageOpened, state => ({ ...state, isOpen: true })),
   on(KeywordsWebSocketActions.messageCallReceived, (state, { call }) => ({ ...state, calls: (state.calls.map((existCall: Call) => (existCall.call_id === call.call_id) ? state.calls[existCall.call_id] : [...state.calls, call])),
  }),
  
  ))
 
 export function reducerFactory(state: KeywordsModel | null, actions: Action) {
   return reducer(state, actions);
 }
 

После messageCallReceived выполнения операции с картой() СОСТОЯНИЕ остается пустым {} .

Пожалуйста, за подсказками.

Ответ №1:

Я не совсем уверен в том, чего вы хотели достичь, но, скорее всего, правильный код будет таким:

 state.calls.map((existCall: Call) => (existCall.call_id === call.call_id) ? call: existCall)
 

это должно обновить только один элемент в вашем массиве

Редактировать: полная логика с обновлением, и если ничего не было обновлено — нажмите новый элемент

 on(KeywordsWebSocketActions.messageCallReceived, (state, { call }) => {
   let wasUpdated = false;
   const newCalls = state.calls.map(c => {
      if( c.call_id == call.call_id) {
         wasUpdated = true;
         return call;
      } else {
         return c;
      }
   })
   if(!wasUpdated){
      newCalls.push(call);
   }
   return {
     ...state,
     calls: newCalls,
   }
})
 

Комментарии:

1. У меня множество звонков. У них разные ключевые слова, а у вызова есть идентификатор call_id. Массив пуст в начале. Если массив пуст или нет вызова с идентификатором входящего вызова, то он должен добавить вызов в массив вызовов в состоянии. В противном случае, когда массив в состоянии имеет вызов с входящим идентификатором, он обновит соответствующий вызов. Теперь initialState.calls[] по-прежнему пуст 🙁

2. пожалуйста, дайте мне больше разъяснений.

3. а, понятно. этот код просто заменит соответствующий элемент. Я обновлю ответ с логикой о том, как добавлять элементы, если они не найдены