Skip to main content

$parsers and $formatters in Angularjs

$parsers and $formatters are array of function defined on ngModelController. When there is change in values (view or model), the value is passed through the $parsers or $formatters pipeline to convert it according to the needs.

$parsers (View to Model):

  • $parsers is an array of function which executes when there is change in view  value ($veiwValue), usually via user input.
  • $parsers cause the conversion of view value into the form desirable to assign in model value.
  • The value is passed through each $parsers function and the return value of one function is passed to next function.
  • Last return value is passed to $validators and after validation the value is assigned to model.
  • These $parsers functions are called array order (i.e. index 0 to n).
  • $parsers are not called when there is change in model value programmatically.
  • $parsers function must return some value. If it not, causes parse error and model value is set to undefined.
Let's see the simple example to understand how $parsers works. Here is code;
HTML Code:

<div ng-app="myApp" ng-controller="myAppCtrl">
 view value = <input type="text" ng-model="v" parsers-example><br>
 model value = {{v}}
</div>
Javascript Code:

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

app.controller('myAppCtrl',['$scope',function($scope){
 $scope.v = '';
}]);

app.directive('parsersExample',[function(){
 return {
  require : 'ngModel',
  link : function(scope, iElement, iAttribute, ngModelController){

   function parser1(veiwvalue){
    if(veiwvalue){
     return veiwvalue + '_parser1';
    }
   }

   function parser2(veiwvalue){
    if(veiwvalue){
     return veiwvalue + '_parser2';
    }
   }

   ngModelController.$parsers.push(parser2);
   ngModelController.$parsers.push(parser1);
  }
 };
}]);
In the above HTML code, we have used input field to change the view value and one way binding to see the model value. In javascript code, we have defined a directive called parsersExample. In the linking function of the directive, we have defined two parsers functions namely parsers1() and parsers2(). And then pushed the function into the $parsers array defined on ngModelController. The order of pushing (note that functions are pushed in array) of functions matters. See the working example to understand the execution of functions:



$formatters (Model to View):

  • $formatters is an array of function which execute when there is change in expression bound in ngModel programmatically, usually via events or function call.
  • $formatters cause the conversion of $modelValue into the form desirable to assign in $veiwValue. Formatters are used to format / convert the $modelValue for display.
  • The value is passed through each $formatters function and the return value of one function is passed to next function.
  • Last return value is used as actual DOM value.
  • These $parsers functions are called reverse array order (i.e. index n to 0).
  • $formatters are not called when there is change in value via user interaction.
  • $formatters function must return some value. If it not, causes error and view value is set to undefined.
Let's see the simple example to understand how $formatters works. Here is code;
HTML Code:

<div ng-app="myApp" ng-controller="myAppCtrl">
 model value = {{v}} | <button ng-click="addTwo()">Add 2 to model value</button><br><br>
 view value = <input type="text" ng-model="v" formatters-example><br>
</div>
Javascript Code:

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

app.controller('myAppCtrl',['$scope',function($scope){
 $scope.v = 0;
 $scope.addTwo = function(){
  $scope.v += 2;
 }
}]);

app.directive('formattersExample',[function(){
 return {
  require : 'ngModel',
  link : function(scope, iElement, iAttribute, ngModelController){

   function formatters1(modelvalue){
    if(modelvalue){
     return modelvalue + '_formatters1';
    }
   }

   function formatters2(modelvalue){
    if(modelvalue){
     return modelvalue + '_formatters2';
    }
   }

   ngModelController.$formatters.unshift(formatters2);
   ngModelController.$formatters.unshift(formatters1);
  }
 };
}]);
In the above HTML code, we have used input field to the view value and one way binding to see the model value. Function addTwo() is defined to add 2 in model value and is called via button click. In javascript code, we have defined a directive called formattersExample. In the linking function of the directive, we have defined two formatters functions namely formatters1() and formatters2(). And then unshift the function into the $formatters array defined on ngModelController. The order of unshifting (note that functions are unshift in array) of functions matters. See the working example to understand the execution of functions:


Comments

Popular posts from this blog

Automatic Slashing the Date Input using Angularjs

We define a directive that will automatically slash the input field as user typein the date. The directive have following capabiltiy: The directive will append slash '/' when input field has 2 or 5 characters. The input will accept only 10 characters (dd/mm/yyyy). Validity of date provide will not be checked. When the backspace is pressed it will remove the last two character if last character is slash. Otherwise it will remove last character from the input field. The input will not accept characters other than numbers (0 to 9). Let's jump into the code. We will use bootstrap for awesome look: HTML Code: <div class="container" ng-app="myApp" ng-controller="myAppCtrl"> <div class="row"> <div class="col-sm-8 col-sm-offset-2"> <form class="form-horizontal"> <h4 class="bg-primary">Auto Slashing Date using Angularjs Directive</h4> <div class=...

Code Syntax Highlighting on Blogger using Prismjs

Prismjs is developed by Lea Verou. It is a lightweight, extensible syntax highlighter, built with modern web standards in mind. It’s used in thousands of websites, including some of those you visit daily.Today, we will see how to use the prismjs on blogger to highlight our codes. It very easy and step by step process to follow: Goto to this link and get the personalized links for prismjs or simply copy the links given below: <link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.6.0/themes/prism-coy.min.css" rel="stylesheet"></link> <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.0/prism.min.js"></script> Goto Theme > Edit HTML and paste the links before the closing </head> section as shown below: Default prism.min.js file contain the functionality to highlight the code for only HTML, CSS and JS code. If you wish to use other language to highlight, you have to paste the link for that langu...

Conversion between Date String and Timestamp using Angularjs Directive

Let me ask you one question. Can a veiwValue and modelValue have same value into a different format? The answer is YES . Here we will see how it can be possible. We will see it through a simple example that converts date string (viewValue) into timestamp (modelValue). We will use a text box to enter a date string (dd/mm/yyyy) and convert it into timestamp that will be stored into model value. The trick is that we will use $parsers to convert the date string into the timestamp and $formatters to change the timestamp stored in modelValue to date string that will be shown on text input. Let's see the codes first: HTML Code: <h4>Date to Timestamp</h4> <div class="form-group"> <label for="date1" class="col-sm-3 control-label">Date1 VeiwValue:</label> <div class="col-sm-3"> <input type="text" id="date1" class="form-control" name="date1" ng-model="ob...