aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Windwer2013-07-02 15:14:24 -0400
committerBrian Ford2013-08-07 13:59:41 -0700
commit4407e81c618d42c70e8cfca4f52dfc4a669b5c68 (patch)
tree874f1ea121c0d3ecdd1bd5165114e868ea45b165
parentad76e77fce09d0aee28b5ca1a328d5df8596b935 (diff)
downloadangular.js-4407e81c618d42c70e8cfca4f52dfc4a669b5c68.tar.bz2
feat(ngForm): Supports expression in form names
<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.
-rw-r--r--src/ng/directive/form.js4
-rw-r--r--test/ng/directive/formSpec.js29
2 files changed, 29 insertions, 4 deletions
diff --git a/src/ng/directive/form.js b/src/ng/directive/form.js
index 72f752be..ec91f4b8 100644
--- a/src/ng/directive/form.js
+++ b/src/ng/directive/form.js
@@ -306,13 +306,13 @@ var formDirectiveFactory = function(isNgForm) {
alias = attr.name || attr.ngForm;
if (alias) {
- scope[alias] = controller;
+ setter(scope, alias, controller, alias);
}
if (parentFormCtrl) {
formElement.bind('$destroy', function() {
parentFormCtrl.$removeControl(controller);
if (alias) {
- scope[alias] = undefined;
+ setter(scope, alias, undefined, alias);
}
extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards
});
diff --git a/test/ng/directive/formSpec.js b/test/ng/directive/formSpec.js
index f8e4cf63..b5bbe535 100644
--- a/test/ng/directive/formSpec.js
+++ b/test/ng/directive/formSpec.js
@@ -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();
});
@@ -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">' +