fix(forms): avoid issues with nulls checking on validation status and other form states.

Closes #4338
This commit is contained in:
Alex Rickabaugh 2015-09-23 12:37:54 -07:00
parent 1f2302e39e
commit 7714d6a6eb
2 changed files with 23 additions and 7 deletions

View File

@ -1,19 +1,22 @@
import {AbstractControl} from '../model';
import {isPresent} from 'angular2/src/core/facade/lang';
export class AbstractControlDirective {
get control(): AbstractControl { return null; }
get value(): any { return this.control.value; }
get value(): any { return isPresent(this.control) ? this.control.value : null; }
get valid(): boolean { return this.control.valid; }
get valid(): boolean { return isPresent(this.control) ? this.control.valid : null; }
get errors(): StringMap<string, any> { return this.control.errors; }
get errors(): StringMap<string, any> {
return isPresent(this.control) ? this.control.errors : null;
}
get pristine(): boolean { return this.control.pristine; }
get pristine(): boolean { return isPresent(this.control) ? this.control.pristine : null; }
get dirty(): boolean { return this.control.dirty; }
get dirty(): boolean { return isPresent(this.control) ? this.control.dirty : null; }
get touched(): boolean { return this.control.touched; }
get touched(): boolean { return isPresent(this.control) ? this.control.touched : null; }
get untouched(): boolean { return this.control.untouched; }
get untouched(): boolean { return isPresent(this.control) ? this.control.untouched : null; }
}

View File

@ -800,6 +800,19 @@ export function main() {
rootTC.detectChanges();
expect(input.value).toEqual("aa");
})));
it("should not crash when validity is checked from a binding",
inject([TestComponentBuilder], fakeAsync((tcb: TestComponentBuilder) => {
// {{x.valid}} used to crash because valid() tried to read a property
// from form.control before it was set. This test verifies this bug is
// fixed.
var t = `<form><div ng-control-group="x" #x="form">
<input type="text" ng-control="test"></div>{{x.valid}}</form>`;
var rootTC: RootTestComponent;
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then(
(root) => { rootTC = root; });
tick();
rootTC.detectChanges();
})));
});
});
}