Angular директива игнорировать нечисловой ввод
Мне нужно написать код для IE8. У меня есть ng-repeat, создающий таблицу, заполненную:
<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 не будет делать type = number
Мне нужна директива, которая будет игнорировать нажатия клавиш в этом поле ввода, которые не являются числовыми ключами.... то есть.... 0 - 9
Я не хочу, чтобы пользователь вводил abc и загрязнял модель, а затем указывал, что значение недействительно. Я бы предпочел не позволять им вводить данные, которые недействительны в первую очередь.
Ответы
Ответ 1
HTML:
<input production-qty type="text" maxlength="3" ng-model="qty1">
Директива
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
Смотрите также фильтры на ng-модели во вводе. Мой ответ выше моделируется с помощью pkozlowski.opensource answer.
Я посмотрел на ng-шаблон, но он не фильтрует то, что показано в текстовом поле. Он устанавливает $scope.qty1
в undefined
, но нежелательные символы видны в текстовом поле.
Ответ 2
HTML:
<input type="number" name="graduationYear" ng-model="gradYear" only-num>
Директива
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();
}
});
};
});
Ответ 3
Сначала включите этот код в файл js
numericInput.js
Директива: -
.directive('numeric', function() {
return function(scope, element, attrs) {
$(element[0]).numericInput({ allowFloat: true });
};
})
HTML: -
<input type="text" numeric />
DEMO Числовое демо
Ответ 4
не директива, но я использую просто:
контроллер:
$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]">
он не является директивой, но может использоваться в директиве как сторонний