Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit be99562

Browse files
fix(forms): make NgForm emit FormSubmittedEvent and FormResetEvent (#60887)
Currently, only forms created with `FormGroupDirective` emit events on form submission and resetting. This commit extends this behavior to Template-driven forms also. Related to #58894 PR Close #60887
1 parent e1b0e94 commit be99562

File tree

3 files changed

+47
-1
lines changed

3 files changed

+47
-1
lines changed

‎packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json

+2
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@
7878
"EventManagerPlugin",
7979
"FormControl",
8080
"FormGroup",
81+
"FormResetEvent",
82+
"FormSubmittedEvent",
8183
"FormsExampleModule",
8284
"FormsModule",
8385
"INJECTOR",

‎packages/forms/src/directives/ng_form.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@ import {
2222
ɵWritable as Writable,
2323
} from '@angular/core';
2424

25-
import {AbstractControl, FormHooks} from '../model/abstract_model';
25+
import {
26+
AbstractControl,
27+
FormHooks,
28+
FormResetEvent,
29+
FormSubmittedEvent,
30+
} from '../model/abstract_model';
2631
import {FormControl} from '../model/form_control';
2732
import {FormGroup} from '../model/form_group';
2833
import {
@@ -338,6 +343,7 @@ export class NgForm extends ControlContainer implements Form, AfterViewInit {
338343
this.submittedReactive.set(true);
339344
syncPendingControls(this.form, this._directives);
340345
this.ngSubmit.emit($event);
346+
this.form._events.next(new FormSubmittedEvent(this.control));
341347
// Forms with `method="dialog"` have some special behavior
342348
// that won't reload the page and that shouldn't be prevented.
343349
return ($event?.target as HTMLFormElement | null)?.method === 'dialog';
@@ -360,6 +366,7 @@ export class NgForm extends ControlContainer implements Form, AfterViewInit {
360366
resetForm(value: any = undefined): void {
361367
this.form.reset(value);
362368
this.submittedReactive.set(false);
369+
this.form._events.next(new FormResetEvent(this.form));
363370
}
364371

365372
private _setUpdateStrategy() {

‎packages/forms/test/directives_spec.ts

+37
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {fakeAsync, flushMicrotasks, tick} from '@angular/core/testing';
1111
import {
1212
AbstractControl,
1313
CheckboxControlValueAccessor,
14+
ControlEvent,
1415
ControlValueAccessor,
1516
DefaultValueAccessor,
1617
FormArray,
@@ -21,15 +22,20 @@ import {
2122
FormGroup,
2223
FormGroupDirective,
2324
FormGroupName,
25+
FormResetEvent,
26+
FormSubmittedEvent,
2427
NgControl,
2528
NgForm,
2629
NgModel,
2730
NgModelGroup,
2831
SelectControlValueAccessor,
2932
SelectMultipleControlValueAccessor,
33+
StatusChangeEvent,
34+
TouchedChangeEvent,
3035
ValidationErrors,
3136
Validator,
3237
Validators,
38+
ValueChangeEvent,
3339
} from '../index';
3440
import {selectValueAccessor} from '../src/directives/shared';
3541
import {composeValidators} from '../src/validators';
@@ -431,6 +437,37 @@ describe('Form Directives', () => {
431437

432438
expect(f.form.errors).toEqual({'async': true});
433439
}));
440+
441+
describe('events emissions', () => {
442+
it('formControl should emit an event when resetting a form', () => {
443+
const f = new NgForm([], []);
444+
const events: ControlEvent[] = [];
445+
446+
f.form.events.subscribe((event) => events.push(event));
447+
f.resetForm();
448+
449+
expect(events.length).toBe(4);
450+
expect(events[0]).toBeInstanceOf(TouchedChangeEvent);
451+
expect(events[1]).toBeInstanceOf(ValueChangeEvent);
452+
expect(events[2]).toBeInstanceOf(StatusChangeEvent);
453+
454+
// The event that matters
455+
expect(events[3]).toBeInstanceOf(FormResetEvent);
456+
expect(events[3].source).toBe(f.form);
457+
});
458+
459+
it('formControl should emit an event when submitting a form', () => {
460+
const f = new NgForm([], []);
461+
const events: ControlEvent[] = [];
462+
463+
f.form.events.subscribe((event) => events.push(event));
464+
f.onSubmit({} as any);
465+
466+
expect(events.length).toBe(1);
467+
expect(events[0]).toBeInstanceOf(FormSubmittedEvent);
468+
expect(events[0].source).toBe(f.form);
469+
});
470+
});
434471
});
435472

436473
describe('FormGroupName', () => {

0 commit comments

Comments
 (0)