#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. а, понятно. этот код просто заменит соответствующий элемент. Я обновлю ответ с логикой о том, как добавлять элементы, если они не найдены