Невозможно добавить свойство X, объект не расширяется после обновления ngrx 9 - PullRequest
0 голосов
/ 27 марта 2020

У меня проблема вроде

Невозможно добавить свойство X, объект не расширяемый

после обновления моего angular проекта до angular 9 с помощью Ngrx обновить также. Когда я откатываю Ngrxversion до 8, он работает нормально. Но мне нужно обновить это до v9 с angular 9 обновлениями. Это произошло, когда я добавил это как datasource.data в таблицу материалов с дополнительным атрибутом. Я думаю, что дополнительное изменение атрибута является причиной этого. Но я создаю новый массив из того, что мы получили и опробовали, как показано ниже, используя slice.

 myDataArray.slice(0)

Он также не работает.

Я ссылаюсь на список изменений Ngrx версии 8 на 9 и миграцию руководство здесь https://ngrx.io/guide/migration/v9

Как я обнаружил, существует специальное изменение, связанное с неизменяемостью, с angular 9. Они определили там логику неизменности, связанную с действием, состоянием и сериализуемостью c. И я попробовал метод, который они предложили, чтобы решить эти проблемы с обновлением Ngrx V9 здесь https://ngrx.io/guide/store/configuration/runtime-checks

Но они не работают для меня. Это действительно полезно, если у кого-то есть решение этой проблемы. Заранее спасибо ..

трассировка стека ошибок .. (Я также использовал matDataFlatner, где происходит мутация объекта)

app-error-handler.ts: 30 TypeError: Cannot добавить уровень свойства, объект не является расширяемым в MatTreeFlattener.defaultFlattenerTransform [as transformFunction] (tree-table-flattener-builder.ts: 57) в MatTreeFlattener._flattenNode (flat-data-source.ts: 58) в flat-data-source .ts: 81 в Array.forEach () в MatTreeFlattener._flattenChildren (flat-data-source.ts: 78) в MatTreeFlattener._flattenNode (flat-data-source.ts: 65) в flat-data-source.ts: 92 в Array.forEach () в MatTreeFlattener.flattenNodes (flat-data-source.ts: 92) в MatTreeFlatDataSource.set (flat-data-source.ts: 138)

1 Ответ

2 голосов
/ 27 марта 2020

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

Вы можете сделать myDataArray = JSON.parse(JSON.stringify(myDataArray)) перед тем, как вносить в него изменения.

Существуют более эффективные способы глубокого клонирования объекта, например, с помощью быстро копия .

...