59

I've found some strange behavior: angular trims model values by default. And quick googling doesn't help me to solve this problem. I've found ng-no-trim directive proposals, ng-trim and so on. But nothing works.

I've provided a little snippet that represents this issue below.

function Ctrl($scope) {
  $scope.text='';

  $scope.$watch('text', function (newValue) {
    console.log(newValue);
  });
}

Also you could try this snippet here.

I've added a textarea that is in sync with model text. But it doesn't react for watching when add new trailing spaces or break the line to new one.

What could I do to turn off this behavior? Thanks.

3 Answers 3

99

The directive in question is new in 1.1.1; you can see it working using JS Bin snippet.

<textarea cols="30" rows="10" ng-model="text" ng-trim="false"></textarea>
Sign up to request clarification or add additional context in comments.

4 Comments

Thanks a lot. I've included 1.1.1 version and now it works great.
No problem. Perhaps worth noting is that 1.1.2 is currently the latest unstable.
Could you tell me one more thing. I've added ng-trim='false' and when I type inside the textarea I need to duplicate it's content in some div, but replace '\n' with br. But my replacement doesn't work. BR is inserted only after I've typed one more char at new line. Any thoughts? Example: jsbin.com/ibosub/12/edit
@InviS String.prototype.replace() with a string parameter replaces only once. Use regexp for multiple replacements. $scope.clone = $scope.text.replace(/\n/g, '<br />');
3

Fallback for angular 1.0.x

var app = angular.module('app', []);

app.directive('ngTrim', function() {
    return {
        require: 'ngModel',
        priority: 300,
        link: function(scope, iElem, iAttrs, ngModel) {
            if (iAttrs.ngTrim === 'false') {
                // Be careful here. We override any value comming from the previous
                // parsers to return the real value in iElem
                ngModel.$parsers.unshift(function() {
                    return iElem.val();
                });
            }
        }
    }
});

angular.bootstrap(document, ['app']);

http://jsfiddle.net/vXCnj/3/

Comments

3

You can enable/disable trim option by using ng-trim=true/false. Ref https://docs.angularjs.org/api/ng/input/input%5Btext%5D

2 Comments

Good to know. Never heard of this directive before!
For me it was new too @MartynChamberlin

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.