Как обновить подмножество сущностей с помощью ngrx-entity?

Я обновляю набор объектов с помощью запроса HTTP Patch к удаленному серверу. Ответ серверной части включает только обновленные сущности (т.е. не все сущности).

Я установил свой редуктор с адаптером состояния сущности и использую updateMany для обновления своих сущностей:

case settings.SettingsActionTypes.UpdateSettingsSuccess: {
   return {
     ...state,
     ...adapter.updateMany(action.payload.map((category) => Object.assign({}, {id: category.name, changes: category})), state),
     loaded: true,
     loading: false,
   }
 }

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

Есть ли способ указать ngrx обновлять только те объекты, которые включены в action.payload?


person tilo    schedule 12.01.2018    source источник
comment
Вы пробовали удалить ...state? потому что ...adapter.updateMany уже возвращает состояние. Может быть проблема.   -  person Okan Aslankan    schedule 15.01.2018
comment
@OkanAslankan Спасибо за ваш комментарий. Я пробовал это безуспешно.   -  person tilo    schedule 15.01.2018
comment
У меня недавно была аналогичная проблема на работе. Поскольку мы используем реализацию ImmutableJS для нашего состояния, я достиг того, что вы искали, используя настраиваемый обратный вызов, проверяя undefined / пустые значения, mergeDeepWith реализации структуры данных Record. Приведу пример в качестве ответа, если вы не сможете добиться этого завтра.   -  person Shahar Galukman    schedule 15.01.2018
comment
Сокращения - это чистая функция ... Итак, как я понимаю, действий типа updateMany здесь быть не должно, Reducer должен получать обновленную запись только в полезной нагрузке для такого рода вещей, вы должны использовать эффекты, иначе ваш код выглядит абсолютно великолепно .... Он должен работать нормально, если вы попробуете с некоторыми жестко запрограммированными значениями.   -  person Ashwani Kumar    schedule 18.01.2018


Ответы (1)


Не стоит так много раз выкладывать.

Обновление многих принимает состояние как параметр, в котором вы можете использовать свой спред.

return adapter.updateMany( 
   action.payload.map((category) => Object.assign({}, {id: category.name, changes: category})), 
   { ...state, loaded: true, loading: false }
);
person MTJ    schedule 16.01.2018
comment
На самом деле это не решило проблему удаленных элементов, но это была моя ошибка (при отправке действия обновления я изменил состояние). Тем не менее, вы привели меня в нужное русло, указав на другую проблему. Спасибо - person tilo; 25.01.2018