2013-03-21 14 views
20

Muszę napisać kod dla IE8. Mam NG-repeat tworzenia tabeli wypełnionej:dyrektywa kątowa ignoruje nieliczbowe dane wejściowe

<input production-qty type="text" class="input-mini" maxlength="3" ng-model="day.qtyA" ui-event="{ blur : 'updateProduction(day)' }" ng-disabled="day.type=='H'"> 

IE8 nie zrobi typ = numer

chcę dyrektywę, która będzie ignorować naciśnięć tej dziedzinie wejść, które nie klawisze numeryczne. ... ie .... 0 - 9

Nie chcę pozwolić użytkownikowi wpisać abc i zanieczyszczać modelu, a następnie powiedzieć im, że wartość jest nieprawidłowa. Wolałbym, żeby nie podawali żadnych danych, które nie są ważne w pierwszej kolejności.

+0

Zobacz http://stackoverflow.com/a/12947995/215945 na przykładach, jak zbudować własny walidator. –

+0

Nie widzę, jak by mi to pomogło. Nie próbuję po prostu zatrzymać wprowadzania danych do modelu ... ale nawet pojawiać się na ekranie. Chcę wprowadzić input type = number za pomocą type = text z dyrektywą – Jason

+0

Przykro mi, że nie było zbyt pomocne.Parse $ $ może być użyty do filtrowania pokazów w wejściowym polu tekstowym. Proszę zobaczyć plunkera, który napisałem w mojej odpowiedzi. –

Odpowiedz

43

HTML:

<input production-qty type="text" maxlength="3" ng-model="qty1"> 

dyrektywa:

app.directive('productionQty', function() { 
    return { 
    require: 'ngModel', 
    link: function (scope, element, attr, ngModelCtrl) { 
     function fromUser(text) { 
     var transformedInput = text.replace(/[^0-9]/g, ''); 
     console.log(transformedInput); 
     if(transformedInput !== text) { 
      ngModelCtrl.$setViewValue(transformedInput); 
      ngModelCtrl.$render(); 
     } 
     return transformedInput; // or return Number(transformedInput) 
     } 
     ngModelCtrl.$parsers.push(fromUser); 
    } 
    }; 
}); 

Plunker

Zobacz również filters on ng-model in an input. Moja powyższa odpowiedź jest wzorowana na odpowiedzi pkozlowski.opensource.

Przyjrzałem się wzorowi ng, ale nie filtrowałem tego, co widać w polu tekstowym. Ustawia ona $scope.qty1 na undefined, ale niepożądane znaki są widoczne w polu tekstowym.

+0

"Przyjrzałem się wzorowi ng, ale to nie filtruje tego, co widać w polu tekstowym" - dokładnie .... Dam ci spróbować i zobacz, jak to działa ... dzięki za pomoc! – Jason

+0

niesamowite .... wykonane jedną zmianę: return Number (transformedInput); – Jason

+1

To nie działało dla mnie, musiałem dodać jako pierwszą linię w funkcji fromUser po kodzie, jeśli (tekst === undefined) zwraca tekst; – epitka

0

Pierwszy to ten kod w pliku js numericInput.js

dyrektywy: -

.directive('numeric', function() { 
    return function(scope, element, attrs) { 

     $(element[0]).numericInput({ allowFloat: true }); 

    }; 
}) 

HTML: -

<input type="text" numeric /> 

DEMONumeric Demo

+1

spróbuj wprowadzić liczbę ujemną –

+0

użyj tego ... ale nadal nie piszesz znaku minus musisz użyć klawisza ze strzałką w dół dla liczby ujemnej –

-2

nie dyrektywy, ale używam tylko:

kontroler:

$scope.blockNonNumber = function (val, field){ 

     $scope[field] = val.toString().replace(/[^0-9]/g, ''); 

    } 

html:

<input type="text" ng-model="price" ng-change="blockNonNumber(price, 'price')" pattern="[0-99]"> 

to nie dyrektywy, ale mogą być używane w dyrektywie jako wellside

8

HTML:

<input type="number" name="graduationYear" ng-model="gradYear" only-num> 

dyrektywa:

directive('onlyNum', function() { 
    return function(scope, element, attrs) { 

     var keyCode = [8, 9, 37, 39, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 110]; 
     element.bind("keydown", function(event) { 
      //console.log($.inArray(event.which,keyCode)); 
      if ($.inArray(event.which, keyCode) === -1) { 
       scope.$apply(function() { 
        scope.$eval(attrs.onlyNum); 
        event.preventDefault(); 
       }); 
       event.preventDefault(); 
      } 

     }); 
    }; 
}); 
Powiązane problemy