diff --git a/src/AngularPublic.js b/src/AngularPublic.js
index 4f2474fba9f7..60c901a08781 100644
--- a/src/AngularPublic.js
+++ b/src/AngularPublic.js
@@ -55,6 +55,7 @@
ngModelOptionsDirective,
ngAttributeAliasDirectives,
ngEventDirectives,
+ ngNameDirective,
$AnchorScrollProvider,
$AnimateProvider,
@@ -197,7 +198,8 @@ function publishExternalAPI(angular){
maxlength: maxlengthDirective,
ngMaxlength: maxlengthDirective,
ngValue: ngValueDirective,
- ngModelOptions: ngModelOptionsDirective
+ ngModelOptions: ngModelOptionsDirective,
+ ngName: ngNameDirective
}).
directive({
ngInclude: ngIncludeFillContentDirective
diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js
index fa6fe55d9f5e..891e590927aa 100644
--- a/src/ng/directive/input.js
+++ b/src/ng/directive/input.js
@@ -2510,3 +2510,113 @@ var ngModelOptionsDirective = function() {
}]
};
};
+
+/**
+ * @ngdoc directive
+ * @name ngName
+ *
+ * @priority 100
+ *
+ * @description
+ * The `ng-name` directive allows you the ability to evaluate scope expressions on the name attribute.
+ * This directive does not react to the scope expression. It merely evaluates the expression, and sets the
+ * {@link ngModel.NgModelController NgModelController}'s `$name` property and the `` element's
+ * `name` attribute.
+ *
+ *
+ * This is particularly useful when building forms while looping through data with `ng-repeat`,
+ * allowing you evaluate expressions such as as control names.
+ *
+ *
+ *
+ * This is NOT a data binding, in the sense that the attribute is not observed nor is the scope
+ * expression watched. The ngName directive's link function runs after the ngModelController but before ngModel's
+ * link function. This allows the evaluated result to be updated to the $name property prior to the
+ * {@link form.FormController FormController}'s `$addControl` function being called.
+ *