Skip to content

Commit af66400

Browse files
committed
feat(53): solution
1 parent 543770b commit af66400

6 files changed

Lines changed: 74 additions & 38 deletions

File tree

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: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -64,36 +64,24 @@ 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, {
67+
name: new FormControl(this.userStore.name(), { nonNullable: true }),
68+
street: new FormControl(this.userStore.address.street(), {
6969
nonNullable: true,
7070
}),
71-
zipCode: new FormControl(this.userStore.user().address.zipCode, {
71+
zipCode: new FormControl(this.userStore.address.zipCode(), {
7272
nonNullable: true,
7373
}),
74-
city: new FormControl(this.userStore.user().address.city, {
74+
city: new FormControl(this.userStore.address.city(), {
7575
nonNullable: true,
7676
}),
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, {
77+
note: new FormControl(this.userStore.note(), { nonNullable: true }),
78+
title: new FormControl(this.userStore.title(), { nonNullable: true }),
79+
salary: new FormControl(this.userStore.salary(), {
8080
nonNullable: true,
8181
}),
8282
});
8383

8484
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-
}));
85+
this.userStore.updateUser(this.form.getRawValue());
9886
}
9987
}
Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,64 @@
11
import { Injectable, signal } from '@angular/core';
22

3+
export interface Address {
4+
street: string;
5+
zipCode: string;
6+
city: string;
7+
}
8+
9+
export interface User {
10+
name: string;
11+
address: Address;
12+
note: string;
13+
title: string;
14+
salary: number;
15+
}
16+
317
@Injectable({ providedIn: 'root' })
418
export class UserStore {
5-
user = signal({
6-
name: 'Bob',
7-
address: {
8-
street: '',
9-
zipCode: '',
10-
city: '',
11-
},
12-
note: '',
13-
title: '',
14-
salary: 0,
15-
});
19+
private readonly _name = signal('Bob');
20+
private readonly _note = signal('');
21+
private readonly _title = signal('');
22+
private readonly _salary = signal(0);
23+
private readonly _address = {
24+
street: signal(''),
25+
zipCode: signal(''),
26+
city: signal(''),
27+
};
28+
29+
readonly name = this._name.asReadonly();
30+
readonly note = this._note.asReadonly();
31+
readonly title = this._title.asReadonly();
32+
readonly salary = this._salary.asReadonly();
33+
readonly address = {
34+
street: this._address.street.asReadonly(),
35+
zipCode: this._address.zipCode.asReadonly(),
36+
city: this._address.city.asReadonly(),
37+
};
38+
39+
updateUser(
40+
updates: Partial<User & { street: string; zipCode: string; city: string }>,
41+
) {
42+
if (updates.name !== undefined) {
43+
this._name.set(updates.name);
44+
}
45+
if (updates.street !== undefined) {
46+
this._address.street.set(updates.street);
47+
}
48+
if (updates.zipCode !== undefined) {
49+
this._address.zipCode.set(updates.zipCode);
50+
}
51+
if (updates.city !== undefined) {
52+
this._address.city.set(updates.city);
53+
}
54+
if (updates.note !== undefined) {
55+
this._note.set(updates.note);
56+
}
57+
if (updates.title !== undefined) {
58+
this._title.set(updates.title);
59+
}
60+
if (updates.salary !== undefined) {
61+
this._salary.set(updates.salary);
62+
}
63+
}
1664
}

0 commit comments

Comments
 (0)