All my ngRx packages are updated to 17.2.0. I created a very basic NavService with a simple signalState that looks like this:
import { Injectable, inject } from '@angular/core';
import { NavigationEnd, Router } from '@angular/router';
import { Location } from '@angular/common';
import { patchState, signalState } from '@ngrx/signals';
type NavServiceState = {
navData: NavData | null;
currentPage: string;
previousPage: string | null;
};
const initialState: NavServiceState = {
navData: null,
currentPage: '',
previousPage: null,
};
export interface NavData {
[key: string]: any;
}
@Injectable({
providedIn: 'root',
})
export class NavService {
//#region dependency injection
private router = inject(Router);
private location = inject(Location);
//#endregion
readonly state = signalState(initialState);
readonly previousPage = this.state.previousPage;
readonly currentPage = this.state.currentPage;
readonly navData = this.state.navData;
constructor() {
this.router.events.subscribe((ev) => {
console.log(ev);
if (ev instanceof NavigationEnd) {
const previousPage = this.state.currentPage();
const currentPage = ev.url.replace('/', '');
patchState(this.state, { currentPage, previousPage });
}
});
}
push(page: string, navData?: NavData) {
patchState(this.state, { navData });
this.router.navigate([page]);
}
pop() {
if (this.canGoBack) {
patchState(this.state, { navData: null });
this.location.back();
}
}
canGoBack() {
return Boolean(this.state.previousPage());
}
setRoot(page: string, navData?: NavData) {
patchState(this.state, { navData, previousPage: null });
this.router.navigate([page], { replaceUrl: true });
}
}
When I try to call the setRoot function from another component I keep getting this error:
Error: NG0600: Writing to signals is not allowed in a
computed
or aneffect
by default. UseallowSignalWrites
in theCreateEffectOptions
to enable this inside effects.
at core.mjs:32185:15
at throwInvalidWriteToSignalError (signals.mjs:415:5)
at signalUpdateFn (signals.mjs:461:9)
at signalFn.update (core.mjs:17834:53)
at patchState (ngrx-signals.mjs:11:31)
at NavService.setRoot (nav.service.ts:63:15)
at EffectHandle.effectFn (admin-portal-auth.page.ts:34:25)
at EffectHandle.runEffect (core.mjs:37822:18)
at Object.fn (core.mjs:37817:58)
at Object.run (signals.mjs:522:18)
Any ideas on what I’m doing wrong?
I tried copying the example in the official documentation as close as possible to no avail:
NgRx signal state documentation
Matt Wlodarski is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.