Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 410f7c6

Browse files
jbedardNarretz
authored andcommitted
fix(form): allow dynamic form names which initially evaluate to blank
1 parent 9d071b2 commit 410f7c6

File tree

2 files changed

+35
-17
lines changed

2 files changed

+35
-17
lines changed

src/ng/directive/form.js

+14-14
Original file line numberDiff line numberDiff line change
@@ -454,10 +454,12 @@ var formDirectiveFactory = function(isNgForm) {
454454
name: 'form',
455455
restrict: isNgForm ? 'EAC' : 'E',
456456
controller: FormController,
457-
compile: function ngFormCompile(formElement) {
457+
compile: function ngFormCompile(formElement, attr) {
458458
// Setup initial state of the control
459459
formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS);
460460

461+
var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false);
462+
461463
return {
462464
pre: function ngFormPreLink(scope, formElement, attr, controller) {
463465
// if `action` attr is not present on the form, prevent the default action (submission)
@@ -488,23 +490,21 @@ var formDirectiveFactory = function(isNgForm) {
488490
});
489491
}
490492

491-
var parentFormCtrl = controller.$$parentForm,
492-
alias = controller.$name;
493-
494-
if (alias) {
495-
setter(scope, alias, controller, alias);
496-
attr.$observe(attr.name ? 'name' : 'ngForm', function(newValue) {
497-
if (alias === newValue) return;
498-
setter(scope, alias, undefined, alias);
499-
alias = newValue;
500-
setter(scope, alias, controller, alias);
501-
parentFormCtrl.$$renameControl(controller, alias);
493+
var parentFormCtrl = controller.$$parentForm;
494+
495+
if (nameAttr) {
496+
setter(scope, controller.$name, controller, controller.$name);
497+
attr.$observe(nameAttr, function(newValue) {
498+
if (controller.$name === newValue) return;
499+
setter(scope, controller.$name, undefined, controller.$name);
500+
parentFormCtrl.$$renameControl(controller, newValue);
501+
setter(scope, controller.$name, controller, controller.$name);
502502
});
503503
}
504504
formElement.on('$destroy', function() {
505505
parentFormCtrl.$removeControl(controller);
506-
if (alias) {
507-
setter(scope, alias, undefined, alias);
506+
if (nameAttr) {
507+
setter(scope, attr[nameAttr], undefined, controller.$name);
508508
}
509509
extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards
510510
});

test/ng/directive/formSpec.js

+21-3
Original file line numberDiff line numberDiff line change
@@ -881,20 +881,38 @@ describe('form', function() {
881881

882882
it('should rename forms with no parent when interpolated name changes', function() {
883883
var element = $compile('<form name="name{{nameID}}"></form>')(scope);
884-
var element2 = $compile('<div ng-form="name{{nameID}}"></div>')(scope);
884+
var element2 = $compile('<div ng-form="ngform{{nameID}}"></div>')(scope);
885885
scope.nameID = "A";
886886
scope.$digest();
887887
var form = element.controller('form');
888888
var form2 = element2.controller('form');
889+
expect(scope.nameA).toBe(form);
890+
expect(scope.ngformA).toBe(form2);
889891
expect(form.$name).toBe('nameA');
890-
expect(form2.$name).toBe('nameA');
892+
expect(form2.$name).toBe('ngformA');
891893

892894
scope.nameID = "B";
893895
scope.$digest();
896+
expect(scope.nameA).toBeUndefined();
897+
expect(scope.ngformA).toBeUndefined();
898+
expect(scope.nameB).toBe(form);
899+
expect(scope.ngformB).toBe(form2);
894900
expect(form.$name).toBe('nameB');
895-
expect(form2.$name).toBe('nameB');
901+
expect(form2.$name).toBe('ngformB');
896902
});
897903

904+
it('should rename forms with an initially blank name', function() {
905+
var element = $compile('<form name="{{name}}"></form>')(scope);
906+
scope.$digest();
907+
var form = element.controller('form');
908+
expect(scope['']).toBe(form);
909+
expect(form.$name).toBe('');
910+
scope.name = 'foo';
911+
scope.$digest();
912+
expect(scope.foo).toBe(form);
913+
expect(form.$name).toBe('foo');
914+
expect(scope.foo).toBe(form);
915+
});
898916

899917
describe('$setSubmitted', function() {
900918
beforeEach(function() {

0 commit comments

Comments
 (0)