Skip to content

Commit dec222d

Browse files
committed
refactor(forms): Make reset take value
Now you can do form.reset({name: 'cat', age: 4});
1 parent c70e246 commit dec222d

4 files changed

Lines changed: 35 additions & 5 deletions

File tree

goldens/public-api/forms/signals/index.api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ export interface FieldState<TValue, TKey extends string | number = string | numb
180180
metadata<M>(key: AggregateMetadataKey<M, any>): Signal<M>;
181181
metadata<M>(key: MetadataKey<M>): M | undefined;
182182
readonly pending: Signal<boolean>;
183-
reset(): void;
183+
reset(value?: TValue): void;
184184
readonly submitting: Signal<boolean>;
185185
readonly valid: Signal<boolean>;
186186
}

packages/forms/signals/src/api/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,8 +318,10 @@ export interface FieldState<TValue, TKey extends string | number = string | numb
318318
* Resets the {@link touched} and {@link dirty} state of the field and its descendants.
319319
*
320320
* Note this does not change the data model, which can be reset directly if desired.
321+
*
322+
* @param value Optional value to set to the form. If not passed, the value will not be changed.
321323
*/
322-
reset(): void;
324+
reset(value?: TValue): void;
323325
}
324326

325327
/**

packages/forms/signals/src/field/node.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,12 +223,18 @@ export class FieldNode implements FieldState<unknown> {
223223
* Resets the {@link touched} and {@link dirty} state of the field and its descendants.
224224
*
225225
* Note this does not change the data model, which can be reset directly if desired.
226+
*
227+
* @param value Optional value to set to the form. If not passed, the value will not be changed.
226228
*/
227-
reset(): void {
228-
untracked(() => this._reset());
229+
reset(value?: unknown): void {
230+
untracked(() => this._reset(value));
229231
}
230232

231-
private _reset() {
233+
private _reset(value?: unknown) {
234+
if (value) {
235+
this.value.set(value);
236+
}
237+
232238
this.nodeState.markAsUntouched();
233239
this.nodeState.markAsPristine();
234240

packages/forms/signals/test/node/field_node.spec.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,28 @@ describe('FieldNode', () => {
102102
expect(childA()).toBeDefined();
103103
});
104104

105+
describe('resetting', () => {
106+
it('can be reset with a value', () => {
107+
const model = signal({a: 1, b: 2});
108+
const f = form(model, {injector: TestBed.inject(Injector)});
109+
f.a().markAsDirty();
110+
f.a().markAsTouched();
111+
112+
f().reset({a: 5, b: 8});
113+
expect(f.a().value()).toBe(5);
114+
expect(f.a().dirty()).toBe(false);
115+
expect(f.a().touched()).toBe(false);
116+
});
117+
118+
it('can be reset without a value', () => {
119+
const model = signal({a: 1, b: 2});
120+
const f = form(model, {injector: TestBed.inject(Injector)});
121+
122+
f().reset();
123+
expect(f.a().value()).toBe(1);
124+
});
125+
});
126+
105127
describe('dirty', () => {
106128
it('is not dirty initially', () => {
107129
const f = form(

0 commit comments

Comments
 (0)