diff options
| author | Misko Hevery | 2012-03-15 14:08:49 -0700 |
|---|---|---|
| committer | Misko Hevery | 2012-03-19 11:35:09 -0700 |
| commit | 823adb231995e917bc060bfa49453e2a96bac2b6 (patch) | |
| tree | 618aefaaac1c1bc9a4aa46f890c6bd43feab5b01 | |
| parent | 21e74c2d2e8e985b23711785287feb59965cbd90 (diff) | |
| download | angular.js-823adb231995e917bc060bfa49453e2a96bac2b6.tar.bz2 | |
fix(ngForm): alias name||ngForm
form directive was requiring name attribute even when invoked as attribute, resulting in unnecessary duplication
| -rw-r--r-- | src/directive/form.js | 60 | ||||
| -rw-r--r-- | test/directive/formSpec.js | 20 |
2 files changed, 54 insertions, 26 deletions
diff --git a/src/directive/form.js b/src/directive/form.js index 98c291d4..b6d3f4be 100644 --- a/src/directive/form.js +++ b/src/directive/form.js @@ -31,10 +31,10 @@ var nullFormCtrl = { * of `FormController`. * */ -FormController.$inject = ['name', '$element', '$attrs']; -function FormController(name, element, attrs) { +FormController.$inject = ['$element', '$attrs']; +function FormController(element, attrs) { var form = this, - parentForm = element.parent().inheritedData('$formController') || nullFormCtrl, + parentForm = element.parent().controller('form') || nullFormCtrl, invalidCount = 0, // used to easily determine if we are valid errors = form.$error = {}; @@ -45,9 +45,6 @@ function FormController(name, element, attrs) { form.$valid = true; form.$invalid = false; - // publish the form into scope - name(this); - parentForm.$addControl(form); // Setup initial state of the control @@ -131,8 +128,23 @@ function FormController(name, element, attrs) { /** * @ngdoc directive + * @name angular.module.ng.$compileProvider.directive.ng-form + * @restrict EAC + * + * @description + * Nestable alias of {@link angular.module.ng.$compileProvider.directive.form `form`} directive. HTML + * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a + * sub-group of controls needs to be determined. + * + * @param {string=} ng-form|name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + * + */ + + /** + * @ngdoc directive * @name angular.module.ng.$compileProvider.directive.form - * @restrict EA + * @restrict E * * @description * Directive that instantiates @@ -141,12 +153,12 @@ function FormController(name, element, attrs) { * If `name` attribute is specified, the form controller is published onto the current scope under * this name. * - * # Alias: `ng-form` + * # Alias: {@link angular.module.ng.$compileProvider.directive.ng-form `ng-form`} * * In angular forms can be nested. This means that the outer form is valid when all of the child * forms are valid as well. However browsers do not allow nesting of `<form>` elements, for this - * reason angular provides `<ng-form>` alias which behaves identical to `<form>` but allows - * element nesting. + * reason angular provides {@link angular.module.ng.$compileProvider.directive.ng-form `ng-form`} alias + * which behaves identical to `<form>` but allows form nesting. * * * # CSS classes @@ -218,25 +230,31 @@ function FormController(name, element, attrs) { </doc:scenario> </doc:example> */ -var formDirectiveDev = { +var formDirectiveDir = { name: 'form', restrict: 'E', - inject: { - name: 'accessor' - }, controller: FormController, compile: function() { return { pre: function(scope, formElement, attr, controller) { - formElement.bind('submit', function(event) { - if (!attr.action) event.preventDefault(); - }); + if (!attr.action) { + formElement.bind('submit', function(event) { + event.preventDefault(); + }); + } + + var parentFormCtrl = formElement.parent().controller('form'), + alias = attr.name || attr.ngForm; - var parentFormCtrl = formElement.parent().inheritedData('$formController'); + if (alias) { + scope[alias] = controller; + } if (parentFormCtrl) { formElement.bind('$destroy', function() { parentFormCtrl.$removeControl(controller); - if (attr.name) delete scope[attr.name]; + if (alias) { + scope[alias] = undefined; + } extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards }); } @@ -245,5 +263,5 @@ var formDirectiveDev = { } }; -var formDirective = valueFn(formDirectiveDev); -var ngFormDirective = valueFn(extend(copy(formDirectiveDev), {restrict:'EAC'})); +var formDirective = valueFn(formDirectiveDir); +var ngFormDirective = valueFn(extend(copy(formDirectiveDir), {restrict: 'EAC'})); diff --git a/test/directive/formSpec.js b/test/directive/formSpec.js index ec16e19b..5c34b5ad 100644 --- a/test/directive/formSpec.js +++ b/test/directive/formSpec.js @@ -33,9 +33,9 @@ describe('form', function() { it('should remove the widget when element removed', function() { doc = $compile( - '<form name="myForm">' + - '<input type="text" name="alias" ng-model="value" store-model-ctrl/>' + - '</form>')(scope); + '<form name="myForm">' + + '<input type="text" name="alias" ng-model="value" store-model-ctrl/>' + + '</form>')(scope); var form = scope.myForm; control.$setValidity('required', false); @@ -48,6 +48,17 @@ describe('form', function() { }); + it('should use ng-form as form name', function() { + doc = $compile( + '<div ng-form="myForm">' + + '<input type="text" name="alias" ng-model="value"/>' + + '</div>')(scope); + + expect(scope.myForm).toBeDefined(); + expect(scope.myForm.alias).toBeDefined(); + }); + + it('should prevent form submission', function() { var startingUrl = '' + window.location; doc = jqLite('<form name="myForm"><input type="submit" value="submit" />'); @@ -89,8 +100,7 @@ describe('form', function() { it('should allow form name to be an expression', function() { doc = $compile('<form name="obj.myForm"></form>')(scope); - expect(scope.obj).toBeDefined(); - expect(scope.obj.myForm).toBeTruthy(); + expect(scope['obj.myForm']).toBeTruthy(); }); |
