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

Commit

Permalink
feat(ngForm): Supports expression in form names
Browse files Browse the repository at this point in the history
<form name="ctrl.form"> form controller will accessible
as $scope.ctrl.form instead of $scope['ctrl.form']

BREAKING CHANGE:
If you have form names that will evaluate as an expression:

<form name="ctrl.form">

And if you are accessing the form from your controller:

  Before:

  function($scope) {
    $scope['ctrl.form'] // form controller instance
  }

  After:

  function($scope) {
    $scope.ctrl.form // form controller instance
  }

This makes it possible to access a form from a controller
using the new "controller as" syntax. Supporting the previous
behavior offers no benefit.
  • Loading branch information
damrbaby authored and btford committed Aug 7, 2013
1 parent be62193 commit 8ea802a
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 4 deletions.
4 changes: 2 additions & 2 deletions src/ng/directive/form.js
Original file line number Diff line number Diff line change
Expand Up @@ -335,13 +335,13 @@ var formDirectiveFactory = function(isNgForm) {
alias = attr.name || attr.ngForm;

if (alias) {
scope[alias] = controller;
setter(scope, alias, controller, alias);
}
if (parentFormCtrl) {
formElement.on('$destroy', function() {
parentFormCtrl.$removeControl(controller);
if (alias) {
scope[alias] = undefined;
setter(scope, alias, undefined, alias);
}
extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards
});
Expand Down
29 changes: 27 additions & 2 deletions test/ng/directive/formSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,11 @@ describe('form', function() {
});


it('should allow form name to be an expression', function() {
it('should support expression in form name', function() {
doc = $compile('<form name="obj.myForm"></form>')(scope);

expect(scope['obj.myForm']).toBeTruthy();
expect(scope.obj).toBeDefined();
expect(scope.obj.myForm).toBeTruthy();
});


Expand Down Expand Up @@ -325,6 +326,30 @@ describe('form', function() {
});


it('should deregister a child form whose name is an expression when its DOM is removed', function() {
doc = jqLite(
'<form name="parent">' +
'<div class="ng-form" name="child.form">' +
'<input ng:model="modelA" name="inputA" required>' +
'</div>' +
'</form>');
$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(
'<form name="parent">' +
Expand Down

0 comments on commit 8ea802a

Please sign in to comment.