diff --git a/src/.jshintrc b/src/.jshintrc index f5b8b6c54bfe..e5ce17e43234 100644 --- a/src/.jshintrc +++ b/src/.jshintrc @@ -163,9 +163,6 @@ /* ng/compile.js */ "directiveNormalize": false, - /* ng/parse.js */ - "setter": false, - /* ng/directive/directives.js */ "ngDirective": false, diff --git a/src/ng/directive/form.js b/src/ng/directive/form.js index 9c7f52564c91..28c186ebf033 100644 --- a/src/ng/directive/form.js +++ b/src/ng/directive/form.js @@ -449,7 +449,7 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * related scope, under this name. */ var formDirectiveFactory = function(isNgForm) { - return ['$timeout', function($timeout) { + return ['$timeout', '$parse', function($timeout, $parse) { var formDirective = { name: 'form', restrict: isNgForm ? 'EAC' : 'E', @@ -491,21 +491,21 @@ var formDirectiveFactory = function(isNgForm) { } var parentFormCtrl = controller.$$parentForm; + var setter = nameAttr ? getSetter(controller.$name) : noop; if (nameAttr) { - setter(scope, controller.$name, controller, controller.$name); + setter(scope, controller); attr.$observe(nameAttr, function(newValue) { if (controller.$name === newValue) return; - setter(scope, controller.$name, undefined, controller.$name); + setter(scope, undefined); parentFormCtrl.$$renameControl(controller, newValue); - setter(scope, controller.$name, controller, controller.$name); + setter = getSetter(controller.$name); + setter(scope, controller); }); } formElement.on('$destroy', function() { parentFormCtrl.$removeControl(controller); - if (nameAttr) { - setter(scope, attr[nameAttr], undefined, controller.$name); - } + setter(scope, undefined); extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards }); } @@ -514,6 +514,13 @@ var formDirectiveFactory = function(isNgForm) { }; return formDirective; + + function getSetter(expression) { + if (expression === '') { + return $parse('this[""]').assign; + } + return $parse(expression).assign || noop; + } }]; }; diff --git a/src/ng/parse.js b/src/ng/parse.js index 5d0c84aa41bb..b3e5c5642962 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -1610,29 +1610,6 @@ Parser.prototype = { } }; -////////////////////////////////////////////////// -// Parser helper functions -////////////////////////////////////////////////// - -function setter(obj, path, setValue, fullExp) { - ensureSafeObject(obj, fullExp); - - var element = path.split('.'), key; - for (var i = 0; element.length > 1; i++) { - key = ensureSafeMemberName(element.shift(), fullExp); - var propertyObj = ensureSafeObject(obj[key], fullExp); - if (!propertyObj) { - propertyObj = {}; - obj[key] = propertyObj; - } - obj = propertyObj; - } - key = ensureSafeMemberName(element.shift(), fullExp); - ensureSafeObject(obj[key], fullExp); - obj[key] = setValue; - return setValue; -} - var getterFnCacheDefault = createMap(); var getterFnCacheExpensive = createMap();