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 {
if (this._isControlChanged(changes)) {
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});
}
if (isPropertyUpdated(changes, this.viewModel)) {

View File

@ -152,7 +152,9 @@ export class FormControlName extends NgControl implements OnChanges, OnDestroy {
private _setUpControl() {
this._checkParentType();
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;
}
}

View File

@ -1025,7 +1025,7 @@ export function main() {
});
describe('custom value accessors', () => {
it('should support custom value accessors', () => {
it('should support basic functionality', () => {
const fixture = TestBed.createComponent(WrappedValueForm);
const form = new FormGroup({'login': new FormControl('aa')});
fixture.componentInstance.form = form;
@ -1047,7 +1047,7 @@ export function main() {
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);
fixture.componentInstance.form = new FormGroup({'login': new FormControl('aa')});
@ -1063,6 +1063,27 @@ export function main() {
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');
});
});
});