Я использую angular 9 и ngrx 9
У меня есть такой селектор:
this.store$
.pipe(select(SettingsStoreSelectors.selectNavigationSettings), take(1))
.subscribe((settings: SettingsStoreModels.INavigationSettings) => {
let copy = JSON.parse(JSON.stringify(settings));
this.settings = copy.vrMapSettings;
});
Это единственное место, settings
назначенное в этом компоненте
В этом компоненте у меня есть флажок, который редактирует свойство настройки
<mat-checkbox
class="setting-input"
*ngIf="viewer"
(click)="$event.stopPropagation()"
(change)="onSettingChange(settings, true)"
[(ngModel)]="settings.depthTestAgainstTerrain"
>
{{ "MAP.SETTINGS.DEPTH_TEST_AGAINST_TERRAIN" | translate }}
</mat-checkbox>
Это продолжает запускать
core. js: 4117 ERROR TypeError: Невозможно назначить только для чтения свойство 'depthTestAgainstTerrain' объекта '[object Object]'
Но я больше не понимаю, что делать. Я глубоко клонировал свойство своего магазина, я хочу отредактировать, чтобы повторно отправить действие, но это невозможно. почему ...
EDIT: на самом деле я выяснил причину, но я не понимаю, как ее правильно использовать.
Я глубоко клонирую объект, как указано выше из моего селектора
При изменении настройки я отправляю действие для изменения объекта настройки в хранилище: этот объект настройки действия ссылается на тот же объект, который используется компонентом.
this.store$.dispatch(new SettingsStoreAction.SetNavigationSettings({ settings: { vrMapSettings: settings } }));
Который вызывает этот редуктор:
const SET_NAVIGATION_SETTINGS = (state: State, action: featureAction.SetNavigationSettings) => {
return {
...state,
navigation: {
...state.navigation,
...action.payload.settings,
},
};
};
Но тогда, если я снова отредактирую, поскольку хранилище ссылается непосредственно на объект настройки компонента, это вызовет ошибку ....
Если Я тоже здесь глубоко клонирую
this.store$.dispatch(new SettingsStoreAction.SetNavigationSettings({ settings: { vrMapSettings: JSON.parse(JSON.stringify(settings))} }));
Это работает ...
Но если мне нужно создать небольшое действие для КАЖДОГО свойства настроек или глубокое клонирование для КАЖДОЙ отправки / выбора store, будет ОГРОМНЫЙ недостаток в производительности ...
правильно ли я его использую?
Если вам нужна дополнительная информация, прокомментируйте, я дам.