diff --git a/src/ng/directive/form.js b/src/ng/directive/form.js index 5eec23f1babd..5a176c461c03 100644 --- a/src/ng/directive/form.js +++ b/src/ng/directive/form.js @@ -299,7 +299,7 @@ function FormController(element, attrs) { */ var formDirectiveFactory = function(isNgForm) { - return ['$timeout', function($timeout) { + return ['$timeout', '$parse', function($timeout, $parse) { var formDirective = { name: 'form', restrict: 'E', @@ -335,13 +335,13 @@ var formDirectiveFactory = function(isNgForm) { alias = attr.name || attr.ngForm; if (alias) { - scope[alias] = controller; + $parse(alias).assign(scope, controller); } if (parentFormCtrl) { formElement.on('$destroy', function() { parentFormCtrl.$removeControl(controller); if (alias) { - scope[alias] = undefined; + $parse(alias).assign(scope, undefined); } extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards }); diff --git a/test/ng/directive/formSpec.js b/test/ng/directive/formSpec.js index f61734147fd6..5731b47d99a9 100644 --- a/test/ng/directive/formSpec.js +++ b/test/ng/directive/formSpec.js @@ -72,10 +72,11 @@ describe('form', function() { }); - it('should allow form name to be an expression', function() { + it('should support expression in form name', function() { doc = $compile('
')(scope); - expect(scope['obj.myForm']).toBeTruthy(); + expect(scope.obj).toBeDefined(); + expect(scope.obj.myForm).toBeTruthy(); }); @@ -314,6 +315,30 @@ describe('form', function() { }); + it('should deregister a child form whose name is an expression when its DOM is removed', function() { + doc = jqLite( + '
' + + '
' + + '' + + '
' + + '
'); + $compile(doc)(scope); + scope.$apply(); + + var parent = scope.parent, + child = scope.child.form; + + expect(parent).toBeDefined(); + expect(child).toBeDefined(); + expect(parent.$error.required).toEqual([child]); + doc.children().remove(); //remove child + + expect(parent.child).toBeUndefined(); + expect(scope.child.form).toBeUndefined(); + expect(parent.$error.required).toBe(false); + }); + + it('should deregister a input when its removed from DOM', function() { doc = jqLite( '
' +