Angular проверить тип ввода = "номер" - программирование
Подтвердить что ты не робот

Angular проверить тип ввода = "номер"

У меня такая разметка:

<form name="myForm" ng-controller="myCtrl" novalidate>
    <input ng-model="theValue" type="range" min="0" max="100" required>
    <input ng-model="theValue" type="number" required></input>
    <span ng-show="theValue.$error.number">Hey! No letters, buddy!</span>
</form>

И я хочу, чтобы диапазон показывал, когда пользователь случайно вводит букву во второй вход. Простой, не так ли? В качестве (возможно) связанной проблемы, значение во втором входе исчезает, когда пользователь перемещает первый вход слайдера. Зачем? Этого не происходит, если я удаляю type-number из разметки.

Чтобы быть ясным: я хочу, чтобы пользователь сразу обнаружил ошибку всплывающей подсказки при ее вводе без какого-либо действия "отправить". (Я бы предпочел не использовать элемент form вообще, но все связанные с ним демоверсии, похоже, требуют его.)

http://jsfiddle.net/7FfWT/

Любое обходное решение приветствуется. Если возможно, напишите рабочий стол.

4b9b3361

Ответ 1

Кажется, есть странная проблема, когда type="number" отлично играет с другими inputs.

Посты в этом сообщении google groups должны получить вас на правильном пути. В частности, последнее сообщение там: https://groups.google.com/forum/#!msg/angular/Ecjx2fo8Qvk/x6iNlZrO_mwJ

Ссылка jsfiddle: http://jsfiddle.net/ABE8U/

Как работа, он сделал директиву:

.directive('toNumber', function () {
    return {
        require: 'ngModel',
        link: function (scope, elem, attrs, ctrl) {
            ctrl.$parsers.push(function (value) {
                return parseFloat(value || '');
            });
        }
    };
});

Кредит Шмули Раскину

Ответ 2

Также вы можете использовать ng-pattern как validator:

<input type="number" ng-model="theValue" name="theValue" step="1" min="0" max="10"  ng-pattern="integerval" required>
<span ng-show="form.theValue.$invalid">Hey! No letters, buddy!</span>

$scope.integerval = /^\d*$/;

Ответ 3

Я обновил директиву для работы с фильтрами ng-repeat. Обратите внимание на "$", который является подстановочным знаком. Эта директива должна обрабатывать 0 просто отлично. Он не подходит для подстановочных знаков на

.directive('toNumber', function() {
    return {
        require: 'ngModel',
        link: function(scope, elem, attrs, ctrl) {
            ctrl.$parsers.push(function(value) {
                return value===0 ? 0 : (parseFloat(value) || '$');
            });
    };
})

Ответ 4

Ответ jzm работал у меня, пока мне не понадобилось "0" в качестве ввода. Я скорректировал код jzm:

.directive('toNumber', function () {
    return {
        require: 'ngModel',
        link: function (scope, elem, attrs, ctrl) {
            ctrl.$parsers.push(function (value) {
                if (value === 0)
                    return 0;

                return parseFloat(value || '');
            });
        }
    };
});

Обратите внимание на добавление блока if (value === 0).

Кто-то, кто понимает логические сравнения JavaScript лучше, чем я мог бы создать более элегантный код.

Ответ 5

jzm, s ответ - действительно замечательный трюк и спас мое время.

Я просто делаю это на один шаг и заменяю parseFloat(value) тем, что он на самом деле делает.

directive('number', function () {
    return {
        require: 'ngModel',
        link: function (scope, elem, attrs, ngModel) {

            ngModel.$parsers.push(function (value) {
                if (value==null)
                  return NaN;
            });
        }
    };
});