Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error: [ngModel:numfmt] Expected `1` to be a number angularjs

I'm beginner in Angular.js.

I'm trying to generate a dynamic form on angular.js app by fetching data from mongodb. I've stored imported data on mongodb through excel sheet so that's why all the JSON values are getting stored in String format.

To tackle that issue I'm generating form dynamically by checking value of JSON object.

Ex: If value contains number ("123456") then I'll display input type="number", if value contains email then input type="email", value contains dob then datepicker and so on..

Following is my template code:

<div class="form-group" ng-repeat="(key,value) in providerList"  ng-if="!$first">                    
   <label>{{key.replace("_", " ") | uppercase}}</label>
   <div ng-if="providerList[key].length > 100">
   <textarea class="form-control" ng-model="providerList[key]"></textarea>
   </div>
   <div ng-if="providerList[key].length < 100 && !isNumeric(providerList[key]) && !checkEmail(providerList[key])">
   <input type="text" class="form-control" id='datepicker' ng-model="providerList[key]">        
   </div>

   <div ng-if="isNumeric(providerList[key])">                        
   <input type="number" class="form-control" ng-model="providerList[key]">        
   </div>

   <div ng-if="checkEmail(providerList[key])">                        
   <input type="email" class="form-control" ng-model="providerList[key]">        
   </div>
</div>

Here's my controller:

    $scope.isNumeric = function (data) {

                if (isNaN(data)) {
                    return false;
                } else {
                    return true;
                }

//                if (/^\d+$/.test(data)) {
//                    return true;
//                } else {
//                    return false;
//                }
            };

            $scope.checkEmail = function (email) {
                var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
                return re.test(email);
            };

Here whenever isNumeric function getting called its showing following error on console:

Error: [ngModel:numfmt] Expected `1` to be a number
http://errors.angularjs.org/1.4.8/ngModel/numfmt?p0=1
minErr/<@http://localhost:1000/js/vendor/angular/angular.js:68:12
numberInputType/<@http://localhost:1000/js/vendor/angular/angular.js:21977:1
ngModelWatch@http://localhost:1000/js/vendor/angular/angular.js:25489:21
$RootScopeProvider/this.$get</Scope.prototype.$digest@http://localhost:1000/js/vendor/angular/angular.js:15888:34
$RootScopeProvider/this.$get</Scope.prototype.$apply@http://localhost:1000/js/vendor/angular/angular.js:16160:13
done@http://localhost:1000/js/vendor/angular/angular.js:10589:36
completeRequest@http://localhost:1000/js/vendor/angular/angular.js:10787:7
requestLoaded@http://localhost:1000/js/vendor/angular/angular.js:10728:1


return logFn.apply(console, args);

angular.js (line 12520)
Error: [ngModel:numfmt] Expected `1234567890` to be a number
http://errors.angularjs.org/1.4.8/ngModel/numfmt?p0=1234567890
minErr/<@http://localhost:1000/js/vendor/angular/angular.js:68:12
numberInputType/<@http://localhost:1000/js/vendor/angular/angular.js:21977:1
ngModelWatch@http://localhost:1000/js/vendor/angular/angular.js:25489:21
$RootScopeProvider/this.$get</Scope.prototype.$digest@http://localhost:1000/js/vendor/angular/angular.js:15888:34
$RootScopeProvider/this.$get</Scope.prototype.$apply@http://localhost:1000/js/vendor/angular/angular.js:16160:13
done@http://localhost:1000/js/vendor/angular/angular.js:10589:36
completeRequest@http://localhost:1000/js/vendor/angular/angular.js:10787:7

Same way I'm calling function for email checking checkEmail and its working perfectly fine so what's the issue with isNumeric function.

like image 431
J.K.A. Avatar asked Dec 14 '22 08:12

J.K.A.


2 Answers

angular.module('numfmt-error-module', [])

.run(function($rootScope) {
  $rootScope.typeOf = function(value) {
    return typeof value;
  };
})

.directive('stringToNumber', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, ngModel) {
      ngModel.$parsers.push(function(value) {
        return '' + value;
      });
      ngModel.$formatters.push(function(value) {
        return parseFloat(value);
      });
    }
  };
});

And then, use 'string-to-number' on respective input.

Reference: https://docs.angularjs.org/error/ngModel/numfmt

like image 129
Lücks Avatar answered Dec 17 '22 02:12

Lücks


Issue is with form input type='number' and JSON string is passed to the model.

You need to parse all numbers in controller (as soons as response is received from $http call) before assigning to the model or before opening the form

like image 29
bhavesh vyas Avatar answered Dec 17 '22 01:12

bhavesh vyas