Skip to content

Commit c33b336

Browse files
committed
refactor: use ngrx signal store
1 parent 5ea6252 commit c33b336

File tree

8 files changed

+83
-47
lines changed

8 files changed

+83
-47
lines changed

apps/signal/53-big-signal-performance/src/app/address.component.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import { UserStore } from './user.service';
77
template: `
88
<div cd-flash class="m-4 block border border-gray-500 p-4">
99
Address:
10-
<div>Street: {{ userService.user().address.street }}</div>
11-
<div>ZipCode: {{ userService.user().address.zipCode }}</div>
12-
<div>City: {{ userService.user().address.city }}</div>
10+
<div>Street: {{ userService.address.street() }}</div>
11+
<div>ZipCode: {{ userService.address.zipCode() }}</div>
12+
<div>City: {{ userService.address.city() }}</div>
1313
</div>
1414
`,
1515
changeDetection: ChangeDetectionStrategy.OnPush,

apps/signal/53-big-signal-performance/src/app/job.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { UserStore } from './user.service';
77
template: `
88
<div cd-flash class="m-4 block border border-gray-500 p-4">
99
Job:
10-
<div>title: {{ userService.user().title }}</div>
11-
<div>salary: {{ userService.user().salary }}</div>
10+
<div>title: {{ userService.title() }}</div>
11+
<div>salary: {{ userService.salary() }}</div>
1212
</div>
1313
`,
1414
changeDetection: ChangeDetectionStrategy.OnPush,

apps/signal/53-big-signal-performance/src/app/name.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { UserStore } from './user.service';
66
selector: 'name',
77
template: `
88
<div cd-flash class="m-4 block border border-gray-500 p-4">
9-
Name: {{ userService.user().name }}
9+
Name: {{ userService.name() }}
1010
</div>
1111
`,
1212
changeDetection: ChangeDetectionStrategy.OnPush,

apps/signal/53-big-signal-performance/src/app/note.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { UserStore } from './user.service';
66
selector: 'note',
77
template: `
88
<div cd-flash class="m-4 block border border-gray-500 p-4">
9-
Note: {{ userService.user().note }}
9+
Note: {{ userService.note() }}
1010
</div>
1111
`,
1212
changeDetection: ChangeDetectionStrategy.OnPush,

apps/signal/53-big-signal-performance/src/app/user-form.component.ts

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { UserStore } from './user.service';
1313
class="rounded-md border border-gray-400"
1414
formControlName="name" />
1515
</div>
16-
<div>
16+
<div formGroupName="address">
1717
Address:
1818
<div>
1919
street:
@@ -64,36 +64,26 @@ export class UserFormComponent {
6464
userStore = inject(UserStore);
6565

6666
form = new FormGroup({
67-
name: new FormControl(this.userStore.user().name, { nonNullable: true }),
68-
street: new FormControl(this.userStore.user().address.street, {
69-
nonNullable: true,
70-
}),
71-
zipCode: new FormControl(this.userStore.user().address.zipCode, {
72-
nonNullable: true,
73-
}),
74-
city: new FormControl(this.userStore.user().address.city, {
75-
nonNullable: true,
67+
name: new FormControl(this.userStore.name(), { nonNullable: true }),
68+
address: new FormGroup({
69+
street: new FormControl(this.userStore.address.street(), {
70+
nonNullable: true,
71+
}),
72+
zipCode: new FormControl(this.userStore.address.zipCode(), {
73+
nonNullable: true,
74+
}),
75+
city: new FormControl(this.userStore.address.city(), {
76+
nonNullable: true,
77+
}),
7678
}),
77-
note: new FormControl(this.userStore.user().note, { nonNullable: true }),
78-
title: new FormControl(this.userStore.user().title, { nonNullable: true }),
79-
salary: new FormControl(this.userStore.user().salary, {
79+
note: new FormControl(this.userStore.note(), { nonNullable: true }),
80+
title: new FormControl(this.userStore.title(), { nonNullable: true }),
81+
salary: new FormControl(this.userStore.salary(), {
8082
nonNullable: true,
8183
}),
8284
});
8385

8486
submit() {
85-
this.userStore.user.update((u) => ({
86-
...u,
87-
name: this.form.getRawValue().name,
88-
address: {
89-
...u.address,
90-
street: this.form.getRawValue().street,
91-
zipCode: this.form.getRawValue().zipCode,
92-
city: this.form.getRawValue().city,
93-
},
94-
note: this.form.getRawValue().note,
95-
title: this.form.getRawValue().title,
96-
salary: this.form.getRawValue().salary,
97-
}));
87+
this.userStore.update(this.form.getRawValue());
9888
}
9989
}
Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,43 @@
1-
import { Injectable, signal } from '@angular/core';
1+
import {
2+
patchState,
3+
signalState,
4+
signalStore,
5+
withMethods,
6+
withState,
7+
} from '@ngrx/signals';
28

3-
@Injectable({ providedIn: 'root' })
4-
export class UserStore {
5-
user = signal({
6-
name: 'Bob',
7-
address: {
8-
street: '',
9-
zipCode: '',
10-
city: '',
9+
// @Injectable({ providedIn: 'root' })
10+
11+
type User = {
12+
name: string;
13+
address: {
14+
street: string;
15+
zipCode: string;
16+
city: string;
17+
};
18+
note: string;
19+
title: string;
20+
salary: number;
21+
};
22+
23+
export const UserStore = signalStore(
24+
{ providedIn: 'root' },
25+
withState(
26+
signalState<User>({
27+
name: 'Bob',
28+
address: {
29+
street: '',
30+
zipCode: '',
31+
city: '',
32+
},
33+
note: '',
34+
title: '',
35+
salary: 0,
36+
}),
37+
),
38+
withMethods((store) => ({
39+
update(user: User): void {
40+
patchState(store, user);
1141
},
12-
note: '',
13-
title: '',
14-
salary: 0,
15-
});
16-
}
42+
})),
43+
);

package-lock.json

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"@ngrx/entity": "19.0.1",
3232
"@ngrx/operators": "19.0.1",
3333
"@ngrx/router-store": "19.0.1",
34+
"@ngrx/signals": "^19.2.1",
3435
"@ngrx/store": "19.0.1",
3536
"@nx/angular": "20.6.4",
3637
"@swc/helpers": "0.5.12",

0 commit comments

Comments
 (0)