diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js
index cd2f0cfc25ab..412d768dc9eb 100644
--- a/src/ng/directive/input.js
+++ b/src/ng/directive/input.js
@@ -25,6 +25,8 @@ var inputType = {
* patterns defined as scope expressions.
* @param {string=} ngChange Angular expression to be executed when input changes due to user
* interaction with the input element.
+ * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trimming the
+ * input.
*
* @example
@@ -32,12 +34,12 @@ var inputType = {
*/
@@ -370,7 +378,14 @@ function isEmpty(value) {
function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
var listener = function() {
- var value = trim(element.val());
+ var value = element.val();
+
+ // By default we will trim the value
+ // If the attribute ng-trim exists we will avoid trimming
+ // e.g.
+ if (toBoolean(attr.ngTrim || 'T')) {
+ value = trim(value);
+ }
if (ctrl.$viewValue !== value) {
scope.$apply(function() {
diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js
index 3b511011d1a6..01669b18dd56 100644
--- a/test/ng/directive/inputSpec.js
+++ b/test/ng/directive/inputSpec.js
@@ -382,6 +382,14 @@ describe('input', function() {
});
+ it('should update the model and not trim the value', function() {
+ compileInput('');
+
+ changeInputValueTo(' a ');
+ expect(scope.name).toEqual(' a ');
+ });
+
+
it('should allow complex reference binding', function() {
compileInput('');