在使用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
};
}
正如您所看到的,第一个文本框工作没有任何问题,但第二个文本框根本不显示该值。我肯定需要保留价值,同时在一定范围内被验证为数字 - 所以我们有什么方法吗?
答案 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,即使模型值不是值,它也应该通过不设置为空来保留原始值。
很抱歉没有提供解决方案。