@@ -3,7 +3,8 @@ import 'dart:async';
33import 'package:meta/meta.dart' ;
44import 'package:angular/angular.dart' ;
55
6- import '../model.dart' show AbstractControl, ControlGroup, Control;
6+ import '../model.dart'
7+ show AbstractControl, AbstractControlGroup, ControlGroup, Control;
78import '../validators.dart' show NG_VALIDATORS;
89import 'abstract_form.dart' show AbstractForm;
910import 'control_container.dart' show ControlContainer;
@@ -75,24 +76,39 @@ import 'shared.dart' show setUpControl, setUpControlGroup, composeValidators;
7576 exportAs: 'ngForm' ,
7677 visibility: Visibility .all,
7778)
78- class NgForm extends AbstractForm {
79- ControlGroup form;
80-
79+ class NgForm extends AbstractNgForm <ControlGroup > {
8180 NgForm (@Optional () @Self () @Inject (NG_VALIDATORS ) List <dynamic > validators) {
8281 form = new ControlGroup ({}, composeValidators (validators));
8382 }
8483
84+ @override
85+ ControlGroup createGroup (NgControlGroup _) => ControlGroup ({});
86+ }
87+
88+ /// Abstract class to easily create forms that are template driven.
89+ ///
90+ /// This allows an implementing form to easily specify how to create control
91+ /// groups, and controls. Allowing for infrastructure to create form systems
92+ /// that are backed by different types such as protos.
93+ abstract class AbstractNgForm <T extends AbstractControlGroup >
94+ extends AbstractForm <T > {
95+ T form;
96+
8597 @Input ('ngDisabled' )
8698 set disabled (bool isDisabled) {
8799 toggleDisabled (isDisabled);
88100 }
89101
90102 Map <String , AbstractControl > get controls => form.controls;
91103
104+ T createGroup (NgControlGroup dir);
105+ // This is separate to allow clients to override the logic if they wish.
106+ Control createControl (NgControl _) => Control ();
107+
92108 @override
93109 void addControl (NgControl dir) {
94110 var container = findContainer (dir.path);
95- var ctrl = new Control ( );
111+ var ctrl = createControl (dir );
96112 container.addControl (dir.name, ctrl);
97113 scheduleMicrotask (() {
98114 setUpControl (ctrl, dir);
@@ -114,7 +130,7 @@ class NgForm extends AbstractForm {
114130 @override
115131 void addControlGroup (NgControlGroup dir) {
116132 var container = findContainer (dir.path);
117- var group = new ControlGroup ({} );
133+ var group = createGroup (dir );
118134 container.addControl (dir.name, group);
119135 scheduleMicrotask (() {
120136 setUpControlGroup (group, dir);
@@ -141,8 +157,8 @@ class NgForm extends AbstractForm {
141157 }
142158
143159 @protected
144- ControlGroup findContainer (List <String > path) {
160+ T findContainer (List <String > path) {
145161 path.removeLast ();
146- return path.isEmpty ? form : (form.findPath (path) as ControlGroup );
162+ return path.isEmpty ? form : (form.findPath (path) as T );
147163 }
148164}
0 commit comments