From d3a8218d7ca914c30b1d341a400d20dfea4b2be6 Mon Sep 17 00:00:00 2001 From: harunurhan Date: Sun, 3 Dec 2017 21:48:45 +0100 Subject: [PATCH] feat(forms): multiple validators for array method (#20766) Change array method signature so that array of validator and/or async validatior functions can be passed. Fixes #20665 PR Close #20766 --- packages/forms/src/form_builder.ts | 4 ++-- packages/forms/test/form_builder_spec.ts | 24 +++++++++++++++++++++++- tools/public_api_guard/forms/forms.d.ts | 2 +- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/forms/src/form_builder.ts b/packages/forms/src/form_builder.ts index 4a34a7ab6b2cca..1d5f8a220198c9 100644 --- a/packages/forms/src/form_builder.ts +++ b/packages/forms/src/form_builder.ts @@ -64,8 +64,8 @@ export class FormBuilder { * configuration, with the given optional `validator` and `asyncValidator`. */ array( - controlsConfig: any[], validator?: ValidatorFn|null, - asyncValidator?: AsyncValidatorFn|null): FormArray { + controlsConfig: any[], validator?: ValidatorFn|ValidatorFn[]|null, + asyncValidator?: AsyncValidatorFn|AsyncValidatorFn[]|null): FormArray { const controls = controlsConfig.map(c => this._createControl(c)); return new FormArray(controls, validator, asyncValidator); } diff --git a/packages/forms/test/form_builder_spec.ts b/packages/forms/test/form_builder_spec.ts index e86cb74a07ca96..0d7bdb32f1791e 100644 --- a/packages/forms/test/form_builder_spec.ts +++ b/packages/forms/test/form_builder_spec.ts @@ -5,9 +5,10 @@ * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ - +import {fakeAsync, tick} from '@angular/core/testing'; import {beforeEach, describe, expect, it} from '@angular/core/testing/src/testing_internal'; import {FormBuilder} from '@angular/forms'; +import {of } from 'rxjs/observable/of'; (function() { function syncValidator(_: any /** TODO #9100 */): any /** TODO #9100 */ { return null; } @@ -97,5 +98,26 @@ import {FormBuilder} from '@angular/forms'; expect(a.validator).toBe(syncValidator); expect(a.asyncValidator).toBe(asyncValidator); }); + + it('should create control arrays with multiple async validators', fakeAsync(() => { + function asyncValidator1() { return of ({'async1': true}); } + function asyncValidator2() { return of ({'async2': true}); } + + const a = b.array(['one', 'two'], null, [asyncValidator1, asyncValidator2]); + expect(a.value).toEqual(['one', 'two']); + + tick(); + + expect(a.errors).toEqual({'async1': true, 'async2': true}); + })); + + it('should create control arrays with multiple sync validators', () => { + function syncValidator1() { return {'sync1': true}; } + function syncValidator2() { return {'sync2': true}; } + + const a = b.array(['one', 'two'], [syncValidator1, syncValidator2]); + expect(a.value).toEqual(['one', 'two']); + expect(a.errors).toEqual({'sync1': true, 'sync2': true}); + }); }); })(); diff --git a/tools/public_api_guard/forms/forms.d.ts b/tools/public_api_guard/forms/forms.d.ts index 793758f3b210e6..d7f3036d3ed23b 100644 --- a/tools/public_api_guard/forms/forms.d.ts +++ b/tools/public_api_guard/forms/forms.d.ts @@ -217,7 +217,7 @@ export declare class FormArrayName extends ControlContainer implements OnInit, O /** @stable */ export declare class FormBuilder { - array(controlsConfig: any[], validator?: ValidatorFn | null, asyncValidator?: AsyncValidatorFn | null): FormArray; + array(controlsConfig: any[], validator?: ValidatorFn | ValidatorFn[] | null, asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null): FormArray; control(formState: any, validator?: ValidatorFn | ValidatorFn[] | null, asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null): FormControl; group(controlsConfig: { [key: string]: any;