fix(forms): fix Validators.min/maxLength with FormArray (#13095)

Fixes #13089
This commit is contained in:
Dzmitry Shylovich 2016-12-12 22:17:12 +03:00 committed by Victor Berchet
parent 2e500cc85b
commit e9f307f948
3 changed files with 27 additions and 7 deletions

View File

@ -36,10 +36,6 @@ export const PENDING = 'PENDING';
*/ */
export const DISABLED = 'DISABLED'; export const DISABLED = 'DISABLED';
export function isControl(control: Object): boolean {
return control instanceof AbstractControl;
}
function _find(control: AbstractControl, path: Array<string|number>| string, delimiter: string) { function _find(control: AbstractControl, path: Array<string|number>| string, delimiter: string) {
if (path == null) return null; if (path == null) return null;

View File

@ -72,7 +72,7 @@ export class Validators {
if (isEmptyInputValue(control.value)) { if (isEmptyInputValue(control.value)) {
return null; // don't validate empty values to allow optional controls 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 ? return length < minLength ?
{'minlength': {'requiredLength': minLength, 'actualLength': length}} : {'minlength': {'requiredLength': minLength, 'actualLength': length}} :
null; null;
@ -84,7 +84,7 @@ export class Validators {
*/ */
static maxLength(maxLength: number): ValidatorFn { static maxLength(maxLength: number): ValidatorFn {
return (control: AbstractControl): {[key: string]: any} => { 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 ? return length > maxLength ?
{'maxlength': {'requiredLength': maxLength, 'actualLength': length}} : {'maxlength': {'requiredLength': maxLength, 'actualLength': length}} :
null; null;

View File

@ -8,7 +8,7 @@
import {fakeAsync, tick} from '@angular/core/testing'; import {fakeAsync, tick} from '@angular/core/testing';
import {describe, expect, it} from '@angular/core/testing/testing_internal'; 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 {Observable} from 'rxjs/Observable';
import {normalizeAsyncValidator} from '../src/directives/normalize_validator'; import {normalizeAsyncValidator} from '../src/directives/normalize_validator';
@ -68,6 +68,18 @@ export function main() {
'minlength': {'requiredLength': 2, 'actualLength': 1} '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', () => { describe('maxLength', () => {
@ -85,6 +97,18 @@ export function main() {
'maxlength': {'requiredLength': 2, 'actualLength': 3} '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', () => { describe('pattern', () => {