diff --git a/modules/@angular/common/src/forms.ts b/modules/@angular/common/src/forms.ts index 3e30cd0bd2..8333300ac7 100644 --- a/modules/@angular/common/src/forms.ts +++ b/modules/@angular/common/src/forms.ts @@ -22,15 +22,16 @@ export {CheckboxControlValueAccessor} from './forms/directives/checkbox_value_ac export {ControlContainer} from './forms/directives/control_container'; export {ControlValueAccessor, NG_VALUE_ACCESSOR} from './forms/directives/control_value_accessor'; export {DefaultValueAccessor} from './forms/directives/default_value_accessor'; -export {FormControlName} from './forms/directives/form_control_name'; export {Form} from './forms/directives/form_interface'; export {NgControl} from './forms/directives/ng_control'; -export {NgControlGroup} from './forms/directives/ng_control_group'; export {NgControlStatus} from './forms/directives/ng_control_status'; export {NgForm} from './forms/directives/ng_form'; export {NgModel} from './forms/directives/ng_model'; +export {NgModelGroup} from './forms/directives/ng_model_group'; export {FormControlDirective} from './forms/directives/reactive_directives/form_control_directive'; +export {FormControlName} from './forms/directives/reactive_directives/form_control_name'; export {FormGroupDirective} from './forms/directives/reactive_directives/form_group_directive'; +export {FormGroupName} from './forms/directives/reactive_directives/form_group_name'; export {NgSelectOption, SelectControlValueAccessor} from './forms/directives/select_control_value_accessor'; export {MaxLengthValidator, MinLengthValidator, PatternValidator, RequiredValidator, Validator} from './forms/directives/validators'; export {FormBuilder} from './forms/form_builder'; diff --git a/modules/@angular/common/src/forms/directives.ts b/modules/@angular/common/src/forms/directives.ts index 3817784581..b8b4550817 100644 --- a/modules/@angular/common/src/forms/directives.ts +++ b/modules/@angular/common/src/forms/directives.ts @@ -2,15 +2,16 @@ import {Type} from '@angular/core'; import {CheckboxControlValueAccessor} from './directives/checkbox_value_accessor'; import {DefaultValueAccessor} from './directives/default_value_accessor'; -import {FormControlName} from './directives/form_control_name'; -import {NgControlGroup} from './directives/ng_control_group'; import {NgControlStatus} from './directives/ng_control_status'; import {NgForm} from './directives/ng_form'; import {NgModel} from './directives/ng_model'; +import {NgModelGroup} from './directives/ng_model_group'; import {NumberValueAccessor} from './directives/number_value_accessor'; import {RadioControlValueAccessor} from './directives/radio_control_value_accessor'; import {FormControlDirective} from './directives/reactive_directives/form_control_directive'; +import {FormControlName} from './directives/reactive_directives/form_control_name'; import {FormGroupDirective} from './directives/reactive_directives/form_group_directive'; +import {FormGroupName} from './directives/reactive_directives/form_group_name'; import {NgSelectOption, SelectControlValueAccessor} from './directives/select_control_value_accessor'; import {NgSelectMultipleOption, SelectMultipleControlValueAccessor} from './directives/select_multiple_control_value_accessor'; import {MaxLengthValidator, MinLengthValidator, PatternValidator, RequiredValidator} from './directives/validators'; @@ -18,16 +19,17 @@ import {MaxLengthValidator, MinLengthValidator, PatternValidator, RequiredValida export {CheckboxControlValueAccessor} from './directives/checkbox_value_accessor'; export {ControlValueAccessor} from './directives/control_value_accessor'; export {DefaultValueAccessor} from './directives/default_value_accessor'; -export {FormControlName} from './directives/form_control_name'; export {NgControl} from './directives/ng_control'; -export {NgControlGroup} from './directives/ng_control_group'; export {NgControlStatus} from './directives/ng_control_status'; export {NgForm} from './directives/ng_form'; export {NgModel} from './directives/ng_model'; +export {NgModelGroup} from './directives/ng_model_group'; export {NumberValueAccessor} from './directives/number_value_accessor'; export {RadioButtonState, RadioControlValueAccessor} from './directives/radio_control_value_accessor'; export {FormControlDirective} from './directives/reactive_directives/form_control_directive'; +export {FormControlName} from './directives/reactive_directives/form_control_name'; export {FormGroupDirective} from './directives/reactive_directives/form_group_directive'; +export {FormGroupName} from './directives/reactive_directives/form_group_name'; export {NgSelectOption, SelectControlValueAccessor} from './directives/select_control_value_accessor'; export {NgSelectMultipleOption, SelectMultipleControlValueAccessor} from './directives/select_multiple_control_value_accessor'; export {MaxLengthValidator, MinLengthValidator, PatternValidator, RequiredValidator} from './directives/validators'; @@ -52,9 +54,7 @@ export {MaxLengthValidator, MinLengthValidator, PatternValidator, RequiredValida * @experimental */ export const FORM_DIRECTIVES: Type[] = /*@ts2dart_const*/[ - NgControlGroup, - - NgModel, NgForm, + NgModel, NgModelGroup, NgForm, NgSelectOption, NgSelectMultipleOption, DefaultValueAccessor, NumberValueAccessor, CheckboxControlValueAccessor, SelectControlValueAccessor, SelectMultipleControlValueAccessor, @@ -64,4 +64,4 @@ export const FORM_DIRECTIVES: Type[] = /*@ts2dart_const*/[ ]; export const REACTIVE_FORM_DIRECTIVES: Type[] = - /*@ts2dart_const*/[FormControlDirective, FormGroupDirective, FormControlName]; \ No newline at end of file + /*@ts2dart_const*/[FormControlDirective, FormGroupDirective, FormControlName, FormGroupName]; \ No newline at end of file diff --git a/modules/@angular/common/src/forms/directives/abstract_form_group_directive.ts b/modules/@angular/common/src/forms/directives/abstract_form_group_directive.ts new file mode 100644 index 0000000000..03009be8f4 --- /dev/null +++ b/modules/@angular/common/src/forms/directives/abstract_form_group_directive.ts @@ -0,0 +1,46 @@ +import {OnDestroy, OnInit} from '@angular/core'; + +import {FormGroup} from '../model'; + +import {ControlContainer} from './control_container'; +import {Form} from './form_interface'; +import {composeAsyncValidators, composeValidators, controlPath} from './shared'; +import {AsyncValidatorFn, ValidatorFn} from './validators'; + +/** + This is a base class for code shared between {@link NgModelGroup} and {@link FormGroupName}. + */ + +export class AbstractFormGroupDirective extends ControlContainer implements OnInit, OnDestroy { + /** @internal */ + _parent: ControlContainer; + + /** @internal */ + _validators: any[]; + + /** @internal */ + _asyncValidators: any[]; + + ngOnInit(): void { this.formDirective.addFormGroup(this); } + + ngOnDestroy(): void { this.formDirective.removeFormGroup(this); } + + /** + * Get the {@link FormGroup} backing this binding. + */ + get control(): FormGroup { return this.formDirective.getFormGroup(this); } + + /** + * Get the path to this control group. + */ + get path(): string[] { return controlPath(this.name, this._parent); } + + /** + * Get the {@link Form} to which this group belongs. + */ + get formDirective(): Form { return this._parent.formDirective; } + + get validator(): ValidatorFn { return composeValidators(this._validators); } + + get asyncValidator(): AsyncValidatorFn { return composeAsyncValidators(this._asyncValidators); } +} diff --git a/modules/@angular/common/src/forms/directives/form_interface.ts b/modules/@angular/common/src/forms/directives/form_interface.ts index 511c0a4af9..13fdf68e4d 100644 --- a/modules/@angular/common/src/forms/directives/form_interface.ts +++ b/modules/@angular/common/src/forms/directives/form_interface.ts @@ -1,7 +1,8 @@ import {FormControl, FormGroup} from '../model'; +import {AbstractFormGroupDirective} from './abstract_form_group_directive'; import {NgControl} from './ng_control'; -import {NgControlGroup} from './ng_control_group'; + /** @@ -30,17 +31,17 @@ export interface Form { /** * Add a group of controls to this form. */ - addFormGroup(dir: NgControlGroup): void; + addFormGroup(dir: AbstractFormGroupDirective): void; /** * Remove a group of controls from this form. */ - removeFormGroup(dir: NgControlGroup): void; + removeFormGroup(dir: AbstractFormGroupDirective): void; /** - * Look up the {@link FormGroup} associated with a particular {@link NgControlGroup}. + * Look up the {@link FormGroup} associated with a particular {@link AbstractFormGroupDirective}. */ - getFormGroup(dir: NgControlGroup): FormGroup; + getFormGroup(dir: AbstractFormGroupDirective): FormGroup; /** * Update the model for a particular control with a new value. diff --git a/modules/@angular/common/src/forms/directives/ng_control_group.ts b/modules/@angular/common/src/forms/directives/ng_control_group.ts deleted file mode 100644 index d5e7cb06e1..0000000000 --- a/modules/@angular/common/src/forms/directives/ng_control_group.ts +++ /dev/null @@ -1,102 +0,0 @@ -import {Directive, Host, Inject, OnDestroy, OnInit, Optional, Self, SkipSelf, forwardRef} from '@angular/core'; - -import {FormGroup} from '../model'; -import {NG_ASYNC_VALIDATORS, NG_VALIDATORS} from '../validators'; - -import {ControlContainer} from './control_container'; -import {Form} from './form_interface'; -import {composeAsyncValidators, composeValidators, controlPath} from './shared'; -import {AsyncValidatorFn, ValidatorFn} from './validators'; - -export const controlGroupProvider: any = - /*@ts2dart_const*/ /* @ts2dart_Provider */ { - provide: ControlContainer, - useExisting: forwardRef(() => NgControlGroup) - }; - -/** - * Creates and binds a control group to a DOM element. - * - * This directive can only be used as a child of {@link NgForm} or {@link FormGroupDirective}. - * - * ```typescript - * @Component({ - * selector: 'my-app', - * template: ` - *