2016-04-12 41 views
-1

bir açısal uygulamada bir float kullanıcı girişine bir kapsam değişkenini bağlamanız gerekir.Float giriş crossbrowser

<my-float ng-model="myValue" name="floatValue"></my-float> 
<button type="button" ng-disable="myValue.$invalid">Submit</submit> 

Kullanıcı virgül veya alanına sahip ve en fazla iki ondalık hane ile ayrılmış bir sayıyı, eklemek gerekir. html girişi, yalnızca ikinci ondalık basamaktan sonra her şeyi görmezden gelen karakterleri göstermelidir.

Testler

  1. 0 -> Tamam -> MyValue =
  2. 0.1, 0 ya da 0,1 -> Tamam -> MyValue = 0.1
  3. 0.12 ya da 0,12 - > Tamam -> modeli = 0.12
  4. 12 -> Tamam -> MyValue =
  5. 12.3 ya da 12.3 12 -> ok MyValue =
  6. 12,34 12,3 veya 12,34 -> tamam myValue = 12.34

    Bu kod benim sorunu çözmek: html burada

    <input name="x" type="text" my-float ng-model="value"> 
    <div>error:{{f.x.$invalid}}</div> 
    

    ile

    app.directive("myFloat",['$filter',function($filter){ 
        var FLOAT_REGEXP = /^\-?\d+((\.|\,)\d+)?$/; 
        return { 
         require: 'ngModel', 
         link: function(scope, elm, attrs, ctrl) { 
          ctrl.$formatters.unshift(function(viewValue){ 
          if (FLOAT_REGEXP.test(viewValue)) 
          { 
           ctrl.$setValidity('float', true); 
           var vv = getNewViewValue(viewValue); 
           var floatValue = parseFloat(vv); 
           ctrl.$setViewValue(vv); 
           ctrl.$render(); 
           return $filter('truncate')(floatValue); 
          } 
          else{ 
           ctrl.$setValidity('float', false); 
          } 
          return viewValue; 
         }); 
    
         var getNewViewValue = function(vv){ 
          var str = (vv +'').replace(",","."); 
          var splitted = str.split("."); 
    
          if(splitted[1] && splitted[1].length > 2){ 
           splitted[1] = splitted[1].substring(0,2); 
           return splitted[0]+'.'+ splitted[1]; 
          } 
          return vv; 
         }; 
    
         ctrl.$parsers.unshift(function(viewValue) { 
          if (FLOAT_REGEXP.test(viewValue)) 
          { 
           ctrl.$setValidity('float', true); 
           var vv = getNewViewValue(viewValue); 
           var floatValue = parseFloat(vv); 
           ctrl.$setViewValue(vv); 
           ctrl.$render(); 
           return $filter('truncate')(floatValue); 
          } 
          else { 
           console.log("input not valid"); 
           ctrl.$setValidity('float', false); 
           return undefined; 
          } 
         }); 
        } 
    } 
    }]); 
    

söyleyebilirim bir plnkr

cevap

0

olduğunu Sen dize olarak MyValue koymak ve geçerliliği için şunları yapabilirsiniz say:

1. if (myValue[n-2] == ',' or myValue[n-3] ==',') 
split the string into two by , 
else split the string into two by . 
2. check second splited part is a number and length is less than two else invalid input 
3. check first part is number , If yes a valid input or else invalid 
+0

Sadece izin verilen karakterleri görmesi için kullanıcıyı kısıtlamam gerekiyor ... bu yüzden $ formatters ve $ render kullanmayı deniyorum – Gianpolo