ОШИБКА TypeError: Невозможно назначить только для чтения свойство isSelected объекта '[Object Object]' - PullRequest
1 голос
/ 03 февраля 2020

Я просто хочу обновить значение свойства элемента массива в My Store NgRx Store после клонирования, чтобы избежать мутации, но безуспешно. Вот код редуктора:

on(
    myActions.elementDeselected,
    (state, { desiredId}) => {
    const childArrayCopy=[...state.selectedObject.childArray.slice(0)];
    const childArray = childArrayCopy.map(arrayElement=> {
        if (arrayElement.id === desiredId) {
          arrayElement.isSelected = false;
          return arrayElement;
        }
        return arrayElement;
      });

      return {
        ...state,
        selectedObject: {
          ...state.selectedObject,
          ...childArray
        }
      };
    }
  ),

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Так как arrayElement только для чтения, вам необходимо скопировать it тоже:

const childArray = childArrayCopy.map(arrayElement=> {
  if (arrayElement.id === desiredId) {
    arrayElement = {...arrayElement, isSelected: false}; // <===
  }
  return arrayElement;
});

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

1 голос
/ 03 февраля 2020

Мутация объектов хранилища не допускается, вы всегда должны создавать копии, также для вложенных объектов:

const childArray = childArrayCopy.map(arrayElement=> ({
  ...arrayElement,
  isSelected: arrayElement.id === desiredId ? false : arrayElement.isSelected
}));
...