feat(forms): add novalidate by default (#13092)

This commit is contained in:
Dzmitry Shylovich 2016-12-12 22:17:42 +03:00 committed by Victor Berchet
parent e9f307f948
commit 4c35be3e07
4 changed files with 44 additions and 1 deletions

View File

@ -14,6 +14,7 @@ import {NgControlStatus, NgControlStatusGroup} from './directives/ng_control_sta
import {NgForm} from './directives/ng_form'; import {NgForm} from './directives/ng_form';
import {NgModel} from './directives/ng_model'; import {NgModel} from './directives/ng_model';
import {NgModelGroup} from './directives/ng_model_group'; import {NgModelGroup} from './directives/ng_model_group';
import {NgNovalidate} from './directives/ng_novalidate_directive';
import {NumberValueAccessor} from './directives/number_value_accessor'; import {NumberValueAccessor} from './directives/number_value_accessor';
import {RadioControlValueAccessor} from './directives/radio_control_value_accessor'; import {RadioControlValueAccessor} from './directives/radio_control_value_accessor';
import {RangeValueAccessor} from './directives/range_value_accessor'; import {RangeValueAccessor} from './directives/range_value_accessor';
@ -47,7 +48,7 @@ export {MaxLengthValidator, MinLengthValidator, PatternValidator, RequiredValida
export const SHARED_FORM_DIRECTIVES: Type<any>[] = [ export const SHARED_FORM_DIRECTIVES: Type<any>[] = [
NgSelectOption, NgSelectMultipleOption, DefaultValueAccessor, NumberValueAccessor, NgSelectOption, NgSelectMultipleOption, DefaultValueAccessor, NumberValueAccessor,
RangeValueAccessor, CheckboxControlValueAccessor, SelectControlValueAccessor, RangeValueAccessor, CheckboxControlValueAccessor, SelectControlValueAccessor,
SelectMultipleControlValueAccessor, RadioControlValueAccessor, NgControlStatus, SelectMultipleControlValueAccessor, RadioControlValueAccessor, NgControlStatus, NgNovalidate,
NgControlStatusGroup, RequiredValidator, MinLengthValidator, MaxLengthValidator, PatternValidator NgControlStatusGroup, RequiredValidator, MinLengthValidator, MaxLengthValidator, PatternValidator
]; ];

View File

@ -0,0 +1,16 @@
/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* 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 {Directive} from '@angular/core';
@Directive({
selector: 'form:not([ngNoForm])',
host: {'novalidate': ''},
})
export class NgNovalidate {
}

View File

@ -71,6 +71,15 @@ export function main() {
expect(input.nativeElement.value).toEqual('loginValue'); expect(input.nativeElement.value).toEqual('loginValue');
}); });
it('should add novalidate by default to form', () => {
const fixture = TestBed.createComponent(FormGroupComp);
fixture.componentInstance.form = new FormGroup({'login': new FormControl('loginValue')});
fixture.detectChanges();
const form = fixture.debugElement.query(By.css('form'));
expect(form.nativeElement.getAttribute('novalidate')).toEqual('');
});
it('work with formGroups (view -> model)', () => { it('work with formGroups (view -> model)', () => {
const fixture = TestBed.createComponent(FormGroupComp); const fixture = TestBed.createComponent(FormGroupComp);
const form = new FormGroup({'login': new FormControl('oldValue')}); const form = new FormGroup({'login': new FormControl('oldValue')});

View File

@ -61,6 +61,16 @@ export function main() {
expect(form.valid).toBe(false); expect(form.valid).toBe(false);
})); }));
it('should add novalidate by default to form element', fakeAsync(() => {
const fixture = TestBed.createComponent(NgModelForm);
fixture.detectChanges();
tick();
const form = fixture.debugElement.query(By.css('form'));
expect(form.nativeElement.getAttribute('novalidate')).toEqual('');
}));
it('should support ngModelGroup', fakeAsync(() => { it('should support ngModelGroup', fakeAsync(() => {
const fixture = TestBed.createComponent(NgModelGroupForm); const fixture = TestBed.createComponent(NgModelGroupForm);
fixture.componentInstance.first = 'Nancy'; fixture.componentInstance.first = 'Nancy';
@ -217,6 +227,13 @@ export function main() {
fixture.detectChanges(); fixture.detectChanges();
expect(fixture.debugElement.children[0].providerTokens.length).toEqual(0); expect(fixture.debugElement.children[0].providerTokens.length).toEqual(0);
}); });
it('should not add novalidate when ngNoForm is used', () => {
const fixture = TestBed.createComponent(NgNoFormComp);
fixture.detectChanges();
const form = fixture.debugElement.query(By.css('form'));
expect(form.nativeElement.hasAttribute('novalidate')).toBeFalsy();
});
}); });
describe('name and ngModelOptions', () => { describe('name and ngModelOptions', () => {