feat(validators): Add a pending state to AbstractControl

Add a pending state to AbstractControl and a function to set that state on
themselves and their parents. This will be used for both individual async
validators and when the imperitive mode is used. [Design Doc](https://docs.google.com/document/d/1EnJ3-_iFpVKFz1ifN1LkXSGQ7h3A72OQGry2g8eo7IA/edit?pli=1#heading=h.j53rt81eegm4)
This commit is contained in:
Ted Sander
2015-10-16 12:04:33 -07:00
committed by vsavkin
parent 04b4035ecd
commit c9fba3fa1f
3 changed files with 42 additions and 0 deletions

View File

@ -13,6 +13,12 @@ export const VALID = "VALID";
*/
export const INVALID = "INVALID";
/**
* Indicates that a Control is pending, i.e. that async validation is occuring and
* errors are not yet available for the input value.
*/
export const PENDING = "PENDING";
export function isControl(control: Object): boolean {
return control instanceof AbstractControl;
}
@ -75,6 +81,7 @@ export class AbstractControl {
get untouched(): boolean { return !this._touched; }
get valueChanges(): Observable { return this._valueChanges; }
get pending(): boolean { return this._status == PENDING; }
markAsTouched(): void { this._touched = true; }
@ -87,6 +94,15 @@ export class AbstractControl {
}
}
markAsPending({onlySelf}: {onlySelf?: boolean} = {}): void {
onlySelf = normalizeBool(onlySelf);
this._status = PENDING;
if (isPresent(this._parent) && !onlySelf) {
this._parent.markAsPending({onlySelf: onlySelf});
}
}
setParent(parent: ControlGroup | ControlArray): void { this._parent = parent; }
updateValidity({onlySelf}: {onlySelf?: boolean} = {}): void {