fix(forms): make Validators.email support optional controls (#20869)

Bring email validator in line with other validators so that empty values are ignored.

PR Close #20869
This commit is contained in:
Phil McCloghry-Laing 2017-12-07 17:24:49 +11:00 committed by Miško Hevery
parent 941e88ff79
commit 140e7c00d1
3 changed files with 16 additions and 0 deletions

View File

@ -125,6 +125,9 @@ export class Validators {
* Validator that performs email validation.
*/
static email(control: AbstractControl): ValidationErrors|null {
if (isEmptyInputValue(control.value)) {
return null; // don't validate empty values to allow optional controls
}
return EMAIL_REGEXP.test(control.value) ? null : {'email': true};
}

View File

@ -1265,6 +1265,13 @@ import {NgModelCustomComp, NgModelCustomWrapper} from './value_accessor_integrat
tick();
expect(input.nativeElement.value).toEqual('');
expect(control.hasError('email')).toBe(false);
input.nativeElement.value = '@';
dispatchEvent(input.nativeElement, 'input');
tick();
expect(input.nativeElement.value).toEqual('@');
expect(control.hasError('email')).toBe(true);
input.nativeElement.value = 'test@gmail.com';

View File

@ -159,6 +159,12 @@ import {map} from 'rxjs/operator/map';
});
describe('email', () => {
it('should not error on an empty string',
() => expect(Validators.email(new FormControl(''))).toBeNull());
it('should not error on null',
() => expect(Validators.email(new FormControl(null))).toBeNull());
it('should error on invalid email',
() => expect(Validators.email(new FormControl('some text'))).toEqual({'email': true}));