【问题标题】:ng-model for input type 'number' not working angularjs输入类型“数字”的 ng-model 不起作用
【发布时间】:2013-05-25 15:24:09
【问题描述】:

在集成 requirejs 之前,我已经将 requirejs 与 angular app 集成在一起,

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

正在显示输入框中的值。
但是与requirejs集成后,type="number"的输入框没有显示值.. type="text" 的输​​入框正在工作。

如何使用 type="number" 显示价值?

谢谢

【问题讨论】:

  • 为什么要同时设置 valueng-model ? ngModel 会自动将 cart.quantity 放入您的输入中!

标签: javascript angularjs requirejs


【解决方案1】:

我刚刚遇到了同样的问题并设法解决了它。在我的例子中,模型是通过 RESTful $resource 获取的,并且金额的值作为字符串提供给字段,这反过来会消除该值。为了解决这个问题,我最终在我的控制器中执行了以下操作:

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

在更新视图之前将值转换为浮点数。我遇到的一个问题是我的第一次尝试是在get 之后立即设置$scope.cart.quantity = parseFloat($scope.cart.quantity, 10)。这不起作用,因为当对 get 的异步调用完成时,该值被覆盖。

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

希望这会有所帮助。

【讨论】:

  • 我没有得到“Expense.get(id: $routeParams.id, (e) -> e.amount = parseFloat(e.amount, 10) )”...你能详细说明一下吗?或者你能生成小提琴吗?
  • 这是咖啡脚本。我已经用 Javascript 更新了答案,也许这更清楚了。
  • 我刚刚遇到了绑定到“$resource”响应的完全相同的问题。不幸的是,我们必须在绑定时明确地解析出数字,但我想这是为我们在视图中免费获得的验证付出的小代价。无论如何,非常感谢您发帖,因为这很快帮助我克服了这个问题。
  • +1 在我的例子中,我让服务器端提供一个整数而不是一个字符串。 My model lives on the server.
  • 有史以来最荒谬的错误
【解决方案2】:

您的绑定值是string 而不是number

首先,检查您的服务器是否正在发送number。如果您使用的是 PHP,您可能希望使用:

json_encode($array, JSON_NUMERIC_CHECK);

您还可以在客户端使用 Javascript 将您的 string 转换为 intfloat

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 是在找到两者时绑定的(是的,它们具有相同的优先级)。

【讨论】:

    【解决方案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);
            });
          }
        }
      }
    })
    

    这样,当通过 restfull 资源获取数据时,您无需更改任何 HTTP 响应。

    必要时限制此指令:)

    【讨论】:

      【解决方案4】:

      值被 ng-model 覆盖。 删除您的 value 属性,您的 ng-model 将使用购物车数量填充输入。

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题(实际上是输入 type="range"),这是我的解决方案,使用自定义指令:

        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=.........
        

        我希望这可以帮助未来的访问者。

        【讨论】:

        • 我将 return value.toString(); 更改为 return (value || $el.attr('min')).toString();.. 效果很好 +1
        【解决方案6】:

        我在输入中添加了一个名称属性,它开始工作了

        【讨论】:

        • 令人惊讶,但它对我有用。我不明白,为什么。谢谢。
        • 我只能推测它与 ngForm 有关,因为 ngModelController 不能作为没有名称的表单的属性使用?但是在代码(v1.5)中没有看到任何东西来确认这一点。
        【解决方案7】:

        如果 cart.quantity 数据类型不是 Number,它将不起作用。

        你需要

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

        【讨论】:

          【解决方案8】:

          在这种情况下,您的 ng-model cart.quantity 必须是数字而不是字符串。

          【讨论】:

            【解决方案9】:

            我找到了这个链接,这对我有帮助。它创建了一个字符串到数字的指令,您可以以类似的方式将其附加到数字输入,如 Ruy Diaz 所示:https://docs.angularjs.org/error/ngModel/numfmt

            【讨论】:

              【解决方案10】:

              我也遇到了同样的问题,并试图找到一个对新手来说很复杂的解决方案 然后我遇到了一个解决方案 旧版本的角度 https://docs.angularjs.org/api/ng/input/input%5Bnumber%5D

              根据哪个 ng-model 接受一个字符串 解决方法是我们定义一个

              分钟

              最大

              使用输入类型=“数字”时的值

              它对我有用,我希望它也适用于其他人

              【讨论】:

                【解决方案11】:

                奇怪,就我而言,从 input type="number" 中删除 minmax 属性对我有用。我的意思是ng-model 工作了!!

                似乎与上面发布的 arpit kumar 完全相反。

                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
                          });
                        }
                      };
                    });
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2019-04-20
                    • 2014-09-29
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-09-12
                    • 2015-12-22
                    • 2018-08-29
                    • 1970-01-01
                    相关资源
                    最近更新 更多