feat(forms): clear (remove all) components from a FormArray (#28918)
This method is a more convenient and efficient way of removing all components from a FormArray. Before it, we needed to loop the FormArray removing each component until empty. Resolves #18531 PR Close #28918
This commit is contained in:
parent
014841dfef
commit
a68b1a1894
|
@ -1895,6 +1895,43 @@ export class FormArray extends AbstractControl {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove all controls in the `FormArray`.
|
||||||
|
*
|
||||||
|
* @usageNotes
|
||||||
|
* ### Remove all elements from a FormArray
|
||||||
|
*
|
||||||
|
* ```ts
|
||||||
|
* const arr = new FormArray([
|
||||||
|
* new FormControl(),
|
||||||
|
* new FormControl()
|
||||||
|
* ]);
|
||||||
|
* console.log(arr.length); // 2
|
||||||
|
*
|
||||||
|
* arr.clear();
|
||||||
|
* console.log(arr.length); // 0
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* It's a simpler and more efficient alternative to removing all elements one by one:
|
||||||
|
*
|
||||||
|
* ```ts
|
||||||
|
* const arr = new FormArray([
|
||||||
|
* new FormControl(),
|
||||||
|
* new FormControl()
|
||||||
|
* ]);
|
||||||
|
*
|
||||||
|
* while (arr.length) {
|
||||||
|
* arr.removeAt(0);
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
clear(): void {
|
||||||
|
if (this.controls.length < 1) return;
|
||||||
|
this._forEachChild((control: AbstractControl) => control._registerOnCollectionChange(() => {}));
|
||||||
|
this.controls.splice(0);
|
||||||
|
this.updateValueAndValidity();
|
||||||
|
}
|
||||||
|
|
||||||
/** @internal */
|
/** @internal */
|
||||||
_syncPendingControls(): boolean {
|
_syncPendingControls(): boolean {
|
||||||
let subtreeUpdated = this.controls.reduce((updated: boolean, child: AbstractControl) => {
|
let subtreeUpdated = this.controls.reduce((updated: boolean, child: AbstractControl) => {
|
||||||
|
|
|
@ -59,6 +59,20 @@ import {of } from 'rxjs';
|
||||||
expect(a.controls).toEqual([c1, c3]);
|
expect(a.controls).toEqual([c1, c3]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should support clearing', () => {
|
||||||
|
a.push(c1);
|
||||||
|
a.push(c2);
|
||||||
|
a.push(c3);
|
||||||
|
|
||||||
|
a.clear();
|
||||||
|
|
||||||
|
expect(a.controls).toEqual([]);
|
||||||
|
|
||||||
|
a.clear();
|
||||||
|
|
||||||
|
expect(a.controls).toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
it('should support inserting', () => {
|
it('should support inserting', () => {
|
||||||
a.push(c1);
|
a.push(c1);
|
||||||
a.push(c3);
|
a.push(c3);
|
||||||
|
|
|
@ -170,6 +170,7 @@ export declare class FormArray extends AbstractControl {
|
||||||
readonly length: number;
|
readonly length: number;
|
||||||
constructor(controls: AbstractControl[], validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null, asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null);
|
constructor(controls: AbstractControl[], validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null, asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null);
|
||||||
at(index: number): AbstractControl;
|
at(index: number): AbstractControl;
|
||||||
|
clear(): void;
|
||||||
getRawValue(): any[];
|
getRawValue(): any[];
|
||||||
insert(index: number, control: AbstractControl): void;
|
insert(index: number, control: AbstractControl): void;
|
||||||
patchValue(value: any[], options?: {
|
patchValue(value: any[], options?: {
|
||||||
|
|
Loading…
Reference in New Issue