0

When I'm trying to create ngrx store I'm getting 7 errors.

TypeError: Cannot assign to read only property '18' of object '[object Array]' | TypeError: Cannot assign to read only property 'incompleteFirstPass' of object '[object Object]' | TypeError: Cannot read properties of undefined (reading 'value')

reducer.ts

import { createReducer, on } from '@ngrx/store';
import { Fields } from '../fields.model';

import { addAllFields } from './fields.action';

export const initialState: Readonly<Fields> = {
  arrStart: [],
  arrEnd: [],
};

export const fieldsReducer = createReducer(
  initialState,
  on(addAllFields, (state, { extArr }) => {
    return { ...state, arrStart: extArr };
  })
);

actions.ts

import { TemplateRef } from '@angular/core';
import { createAction, props } from '@ngrx/store';

export const addAllFields = createAction(
  '[Fields Array]Add fields to starting array',
  props<{ extArr: TemplateRef<any>[] }>()
);

fields.model.ts

import { TemplateRef } from '@angular/core';

export interface Fields {
  arrStart: TemplateRef<any>[] | null;
  arrEnd: TemplateRef<any>[] | null;
}

I know that state must be immutable, and because of this, I return a copy of my current state.

I have dispatch in my component and there must be a problem. console.log(fieldsArr) returns 2 TemplateRef

constructor(private store: Store) {}

  ngOnInit(): void {}

  ngAfterViewInit() {
    const fieldsArr: TemplateRef<any>[] = [this.inputField, this.textareaField];
    console.log(fieldsArr);

    this.store.dispatch(addAllFields({ extArr: fieldsArr }));
  }
1
  • I want to create 2 arrays with TemplateRefs and then exchange Reft within these 2 arrays. But firstly I want to write some starting Refs. Commented Nov 8, 2021 at 18:31

2 Answers 2

1

The problem is probably the TemplateRef, because these are dispatched to the store, these will be frozen. I'm not 100% sure, but my guess is that Angular mutates the TemplateRef on change detection. Because this is the same instance as the one that is frozen by the store, this error is thrown.

Sign up to request clarification or add additional context in comments.

1 Comment

So, what can I do to prevent this from happening?
0

The TemplateRef will be mutated which is forbidden by the architecture of NGRX. If you want to use TemplateRef in ngrx/store, you should deactivate rules of mutation for ngrx like this :

StoreModule.forRoot({}, {
                runtimeChecks: {
                  strictStateImmutability: false,
                  strictActionImmutability: false,
                }
              }),

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.