fix(forms): make setDisabledState optional for reactive form directives (#11731)

Closes #11719
This commit is contained in:
Kara 2016-09-19 16:26:33 -07:00 committed by Alex Eagle
parent bf81b06a28
commit 51d73d3e4e
3 changed files with 29 additions and 4 deletions

View File

@ -90,7 +90,9 @@ export class FormControlDirective extends NgControl implements OnChanges {
ngOnChanges(changes: SimpleChanges): void { ngOnChanges(changes: SimpleChanges): void {
if (this._isControlChanged(changes)) { if (this._isControlChanged(changes)) {
setUpControl(this.form, this); setUpControl(this.form, this);
if (this.control.disabled) this.valueAccessor.setDisabledState(true); if (this.control.disabled && this.valueAccessor.setDisabledState) {
this.valueAccessor.setDisabledState(true);
}
this.form.updateValueAndValidity({emitEvent: false}); this.form.updateValueAndValidity({emitEvent: false});
} }
if (isPropertyUpdated(changes, this.viewModel)) { if (isPropertyUpdated(changes, this.viewModel)) {

View File

@ -152,7 +152,9 @@ export class FormControlName extends NgControl implements OnChanges, OnDestroy {
private _setUpControl() { private _setUpControl() {
this._checkParentType(); this._checkParentType();
this._control = this.formDirective.addControl(this); this._control = this.formDirective.addControl(this);
if (this.control.disabled) this.valueAccessor.setDisabledState(true); if (this.control.disabled && this.valueAccessor.setDisabledState) {
this.valueAccessor.setDisabledState(true);
}
this._added = true; this._added = true;
} }
} }

View File

@ -1025,7 +1025,7 @@ export function main() {
}); });
describe('custom value accessors', () => { describe('custom value accessors', () => {
it('should support custom value accessors', () => { it('should support basic functionality', () => {
const fixture = TestBed.createComponent(WrappedValueForm); const fixture = TestBed.createComponent(WrappedValueForm);
const form = new FormGroup({'login': new FormControl('aa')}); const form = new FormGroup({'login': new FormControl('aa')});
fixture.componentInstance.form = form; fixture.componentInstance.form = form;
@ -1047,7 +1047,7 @@ export function main() {
expect(form.get('login').errors).toEqual(null); expect(form.get('login').errors).toEqual(null);
}); });
it('should support custom value accessors on non builtin input elements that fire a change event without a \'target\' property', it('should support non builtin input elements that fire a change event without a \'target\' property',
() => { () => {
const fixture = TestBed.createComponent(MyInputForm); const fixture = TestBed.createComponent(MyInputForm);
fixture.componentInstance.form = new FormGroup({'login': new FormControl('aa')}); fixture.componentInstance.form = new FormGroup({'login': new FormControl('aa')});
@ -1063,6 +1063,27 @@ export function main() {
input.componentInstance.dispatchChangeEvent(); input.componentInstance.dispatchChangeEvent();
}); });
it('should support custom accessors without setDisabledState - formControlName', () => {
const fixture = TestBed.createComponent(WrappedValueForm);
fixture.componentInstance.form = new FormGroup({
'login': new FormControl({value: 'aa', disabled: true}),
});
fixture.detectChanges();
expect(fixture.componentInstance.form.status).toEqual('DISABLED');
expect(fixture.componentInstance.form.get('login').status).toEqual('DISABLED');
});
it('should support custom accessors without setDisabledState - formControlDirective',
() => {
TestBed.overrideComponent(
FormControlComp,
{set: {template: `<input type="text" [formControl]="control" wrapped-value>`}});
const fixture = TestBed.createComponent(FormControlComp);
fixture.componentInstance.control = new FormControl({value: 'aa', disabled: true});
fixture.detectChanges();
expect(fixture.componentInstance.control.status).toEqual('DISABLED');
});
}); });
}); });