From e9f307f9488e44879dc027e5f4436fb6bc046fa4 Mon Sep 17 00:00:00 2001 From: Dzmitry Shylovich Date: Mon, 12 Dec 2016 22:17:12 +0300 Subject: [PATCH] fix(forms): fix Validators.min/maxLength with FormArray (#13095) Fixes #13089 --- modules/@angular/forms/src/model.ts | 4 --- modules/@angular/forms/src/validators.ts | 4 +-- .../@angular/forms/test/validators_spec.ts | 26 ++++++++++++++++++- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/modules/@angular/forms/src/model.ts b/modules/@angular/forms/src/model.ts index d15b835cc1..958d3775d5 100644 --- a/modules/@angular/forms/src/model.ts +++ b/modules/@angular/forms/src/model.ts @@ -36,10 +36,6 @@ export const PENDING = 'PENDING'; */ export const DISABLED = 'DISABLED'; -export function isControl(control: Object): boolean { - return control instanceof AbstractControl; -} - function _find(control: AbstractControl, path: Array| string, delimiter: string) { if (path == null) return null; diff --git a/modules/@angular/forms/src/validators.ts b/modules/@angular/forms/src/validators.ts index ad8dcbb90f..460bc8fba5 100644 --- a/modules/@angular/forms/src/validators.ts +++ b/modules/@angular/forms/src/validators.ts @@ -72,7 +72,7 @@ export class Validators { if (isEmptyInputValue(control.value)) { return null; // don't validate empty values to allow optional controls } - const length = typeof control.value === 'string' ? control.value.length : 0; + const length: number = control.value ? control.value.length : 0; return length < minLength ? {'minlength': {'requiredLength': minLength, 'actualLength': length}} : null; @@ -84,7 +84,7 @@ export class Validators { */ static maxLength(maxLength: number): ValidatorFn { return (control: AbstractControl): {[key: string]: any} => { - const length = typeof control.value === 'string' ? control.value.length : 0; + const length: number = control.value ? control.value.length : 0; return length > maxLength ? {'maxlength': {'requiredLength': maxLength, 'actualLength': length}} : null; diff --git a/modules/@angular/forms/test/validators_spec.ts b/modules/@angular/forms/test/validators_spec.ts index fcd0cf68d4..0cf4abbb71 100644 --- a/modules/@angular/forms/test/validators_spec.ts +++ b/modules/@angular/forms/test/validators_spec.ts @@ -8,7 +8,7 @@ import {fakeAsync, tick} from '@angular/core/testing'; import {describe, expect, it} from '@angular/core/testing/testing_internal'; -import {AbstractControl, FormControl, Validators} from '@angular/forms'; +import {AbstractControl, FormArray, FormControl, Validators} from '@angular/forms'; import {Observable} from 'rxjs/Observable'; import {normalizeAsyncValidator} from '../src/directives/normalize_validator'; @@ -68,6 +68,18 @@ export function main() { 'minlength': {'requiredLength': 2, 'actualLength': 1} }); }); + + it('should not error when FormArray has valid length', () => { + const fa = new FormArray([new FormControl(''), new FormControl('')]); + expect(Validators.minLength(2)(fa)).toBeNull(); + }); + + it('should error when FormArray has invalid length', () => { + const fa = new FormArray([new FormControl('')]); + expect(Validators.minLength(2)(fa)).toEqual({ + 'minlength': {'requiredLength': 2, 'actualLength': 1} + }); + }); }); describe('maxLength', () => { @@ -85,6 +97,18 @@ export function main() { 'maxlength': {'requiredLength': 2, 'actualLength': 3} }); }); + + it('should not error when FormArray has valid length', () => { + const fa = new FormArray([new FormControl(''), new FormControl('')]); + expect(Validators.maxLength(2)(fa)).toBeNull(); + }); + + it('should error when FormArray has invalid length', () => { + const fa = new FormArray([new FormControl(''), new FormControl('')]); + expect(Validators.maxLength(1)(fa)).toEqual({ + 'maxlength': {'requiredLength': 1, 'actualLength': 2} + }); + }); }); describe('pattern', () => {