Подтвердить что ты не робот

Ng-модель для ввода типа 'number' не работает angularjs

Я включил requirejs с приложением angular перед тем, как выполнить intregrating requirejs,

<input type="number" value="{{cart.quantity}}" ng-model="cart.quantity" />

показывало значение в поле ввода.
Но после интеграции с requirejs поле ввода с типом = "число" не показывает мне значение.. поле ввода с типом = "текст" работает.

Как показать значение с типом = "число"?

Спасибо

4b9b3361

Ответ 1

Я просто столкнулся с этой проблемой и смог ее решить. В моем случае модель получается через RESTful $resource, и значение для этой суммы предоставляется в виде строки в поле, что, в свою очередь, уничтожает значение. Чтобы решить эту проблему, я закончил работу над своим контроллером:

$scope.cart = Cart.get(id: $routeParams.id, function(cart){
    cart.quantity = parseFloat(cart.quantity, 10);
});

который превращает значение в float, перед обновлением представления. Одна попытка, с которой я столкнулся, заключается в том, что моя первая попытка заключалась в установке $scope.cart.quantity = parseFloat($scope.cart.quantity, 10) сразу после get. Это не работает, поскольку значение было перезаписано при завершении асинхронного вызова get.

$scope.cart = Cart.get(id: $routeParams.id);
$scope.cart.quantity = parseFloat($scope.cart.quantity, 10); // This won't work

Надеюсь, что это поможет.

Ответ 2

Ваше привязанное значение - это string не a number.

Прежде всего, убедитесь, что ваш сервер отправляет number. Если вы используете PHP, вы можете использовать:

json_encode($array, JSON_NUMERIC_CHECK);

Вы также можете включить string в int или float с помощью Javascript на стороне клиента:

var data = ['1.9', '3']; //these won't be binded to the numbers-only input
data[0] = parseFloat(data[0]); //this will
data[1] = parseInt(data[1]);

Это не ошибка, так как вход numbers принимает только допустимые числа (надеюсь).


Примечание:

Я также попытался связать ng-value с целочисленным фильтром, но он не будет работать. Возможно, потому что ng-model - это тот, который привязан, когда оба найдены (yup, они имеют одинаковый уровень приоритета).

Ответ 3

Я решаю эту проблему с помощью настраиваемой директивы:

angular.module('directives').directive('input', function() {
  return {
    restrict: 'E',
    require: 'ngModel',
    link: function(scope, $el, attrs, ngModel) {
      if ($el.get(0).type === 'number') {
        ngModel.$parsers.push(function(value) {
          return value.toString();
        });

        ngModel.$formatters.push(function(value) {
          return parseFloat(value, 10);
        });
      }
    }
  }
})

Таким образом, вам не нужно изменять какой-либо ответ HTTP, когда данные получаются с помощью ресурса restfull.

При необходимости ограничьте эту директиву:)

Ответ 4

Значение

переопределяется ng-model. Удалите свойство value, и ваша ng-модель заполнит ввод количеством корзины.

Ответ 5

Я добавил атрибут имени на вход и начал работать

Ответ 6

У меня была та же проблема (с фактическим типом ввода = "диапазон" ), и вот мое решение, используя настраиваемую директиву:

app.directive('ngFloat', function() {
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function(scope, $el, attrs, ngModel) {
        ngModel.$parsers.push(function(value) {
            return parseFloat(value, 10);
        });

        ngModel.$formatters.push(function(value) {
            return value.toString();
        });
    }
  };
});

Поскольку я ограничил директиву атрибутом "ngFloat", необходимо пометить ввод следующим образом:

<input ng-float type=.........

Надеюсь, это поможет будущим посетителям.

Ответ 7

Если тип данных cart.quantity не Number, он не будет работать.

Вам нужно

$scope.cart.quantity = parseFloat($scope.cart.quantity);

Ответ 8

Ваша ng-модель в этом случае cart.quantity должна быть числом, а не строкой.

Ответ 9

Я нашел эту ссылку, которая мне помогла. Он создает директиву "строка-к-номер", которую вы можете присоединить к вводам числа аналогичным образом, что Руй Диаз показал: https://docs.angularjs.org/error/ngModel/numfmt

Ответ 10

Я тоже столкнулся с той же проблемой и попытался найти решение, все было сложным для новичков то я наткнулся на решение в старая версия angular в https://docs.angularjs.org/api/ng/input/input%5Bnumber%5D

согласно которому ng-модель принимает строку обходным путем является то, что мы определяем a

мин

и

макс

при использовании типа ввода = "число"

Это сработало для меня, и я надеюсь, что это сработает и для других.

Ответ 11

Странно, в моем случае для меня работали удаление атрибутов min и max из input type="number". Я имею в виду, что ng-model работает!!

Кажется совершенно противоположным тому, что было написано выше.

Версия AngularJS: 1.6.1

Ответ 12

angular
  .module('xxx')
  .directive('ngFloat', function () {
    return {
      restrict: 'A',
      require: 'ngModel',
      link: function (scope, $el, attrs, ngModel) {
        ngModel.$formatters.push(function (value) {
          return +value
        });
      }
    };
  });