无论输入类型=“数字”的验证,都保留输入值

时间:2014-07-18 18:34:11

标签: javascript angularjs

在使用angularJs和输入type =“number”时,我遇到了奇怪的情况。基本上,如果我输入了类型编号,并且初始值超出了由min和max定义的范围,我的初始值就会被简单地销毁。

我用小提琴来说明问题 - http://jsfiddle.net/PK3QH/2/

HTML:

<div ng-controller="MyCtrl">
    <input ng-model="bindData.SomeAmount" type="number" required="required" />
    <br />
    <input ng-model="bindData.SomeAmount" type="number" required="required" 
        min="2" max="10" />
</div>

使用Javascript:

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    $scope.bindData = {
        SomeAmount: 1
    };
}

正如您所看到的,第一个文本框工作没有任何问题,但第二个文本框根本不显示该值。我肯定需要保留价值,同时在一定范围内被验证为数字 - 所以我们有什么方法吗?

2 个答案:

答案 0 :(得分:2)

我同意这是一个错误。

这是因为格式化程序首先应用于验证程序之前。 “number”

的格式化程序
  if (attr.min) {
    var minValidator = function(value) {
      var min = parseFloat(attr.min);
      return validate(ctrl, 'min', ctrl.$isEmpty(value) || value >= min, value);
    };

    ctrl.$parsers.push(minValidator);
    **ctrl.$formatters.push(minValidator);**
  }

所有$ formatters在最初运行验证程序之前先运行... checkout NgModelController。

我想知道如果他们根据有效性应用了格式化程序,那么$ dirty!的第一个时间是真的,即如果验证结果为假,则让格式化程序产生。

在minNumber的情况下,格式化程序应该只是一个数字。为什么我们需要minNumber的格式化程序?

举起它https://github.com/angular/angular.js/issues/8264

在Angular团队修复之前,这个短期解决方案将是使用您自己的指令而不是min。

答案 1 :(得分:1)

恕我直言,这是一个错误。

如果删除ng-model属性,则会看到初始值。

如果这不是一个错误,当我们输入无效值(例如40)时,我们一定不会看到输入的文本与初始化时一样。看,它不一致。

只有在初始化输入指令时才会发生这种情况。

IMO,即使模型值不是值,它也应该通过不设置为空来保留原始值。

很抱歉没有提供解决方案。