Search code examples
angularjsangularjs-scopeangularjs-ng-model

AngularJS - input type="number" not clearable for non-number (NaN)


Clear number input type does not work for 'e' number

When I clear the input field with input eee in number type, it does not get cleared. Any other input numbers get cleared. Check the JSFiddle. Any hints would be appreciated.

http://jsfiddle.net/2ankx9up/

<div ng-app="app">
   <div ng-controller="MainCtrl">
    <input type="number" class="form-control" data-ng-model="searchAll"> 
    </input> 
    <a class="clear" href="" data-ng-click="clearSearch()">X</a>
   </div>
</div>
var app = angular.module("app", []);
 app.controller("MainCtrl", function ($scope) {
    $scope.searchAll = "";
    $scope.clearSearch = function () {
       $scope.searchAll = "";
    };
});

Solution

  • The ng-model directive is unable to clear the content of an <input type="number"> element when that content parses to NaN (not a number). This can happen when a user pastes invalid content or simply types "eee".

    One fix is to add a custom directive:

    app.directive('clearNan', function() {
      return {
        require: 'ngModel',
        link: function(scope, elem, attrs, ngModel) {
          ngModel.$formatters.push(function(value) {
            if (!value) elem.val(null);
            return value;
          });
        }
      };
    })
    

    Usage:

    <input type="number" clear-nan ng-model="x" />
    

    The DEMO

    angular.module('numfmt-error-module', [])
    .directive('clearNan', function() {
      return {
        require: 'ngModel',
        link: function(scope, elem, attrs, ngModel) {
          ngModel.$formatters.push(function(value) {
            if (!value) elem.val(null);
            return value;
          });
        }
      };
    })
    .run(function($rootScope) {
      $rootScope.typeOf = function(value) {
        return typeof value;
      };
    })
    <script src="//unpkg.com/angular/angular.js"></script>
    <body ng-app="numfmt-error-module">
      <input clear-nan type="number" ng-model="x" />
      <br>
      {{ x }} : {{ typeOf(x) }}
      <br>
      <button ng-click="x=''">Clear input</button>
    </body>