我的项目有一个包含大约16个文本字段的表单。输入需要是数字,不同的字段将具有不同的最小/最大值。我能够找到以下jsfiddle(http://jsfiddle.net/thomporter/DwKZh/)并将解析调整为以下(http://jsfiddle.net/WdBju/):
angular.module('myApp', []).directive('numbersOnly', function(){
return {
require: 'ngModel',
link: function(scope, element, attrs, modelCtrl) {
modelCtrl.$parsers.push(function (inputValue) {
if (inputValue == undefined) {
return '';
}
var firstParse = inputValue.replace(/[^0-9 . -]/g, '');
var safeParse = firstParse.charAt(0);
var prepParse = firstParse.substring(1,firstParse.length);
var secondParse = safeParse + prepParse.replace(/[^0-9 .]/g, '');
var n = secondParse.indexOf(".");
var transformedInput;
if (n == -1) {
transformedInput = secondParse;
}
else {
safeParse = secondParse.substring(0,n+1);
firstParse = (secondParse.substring(n+1,secondParse.length)).replace(/[^0-9]/g, '');
n = 2;
if (firstParse.length <= n) {
transformedInput = safeParse + firstParse;
}
else {
transformedInput = safeParse + firstParse.substring(0,n);
}
}
var min = -25;
var max = 25;
if (transformedInput!=inputValue ||
transformedInput < min ||
transformedInput > max) {
var returnValue;
if (transformedInput < min || transformedInput > max) {
returnValue = transformedInput.substring(0,transformedInput.length-1);
}
else {
returnValue=transformedInput;
}
modelCtrl.$setViewValue(returnValue);
modelCtrl.$render();
}
return returnValue;
});
}
};
});
我对解析很满意,但是最小/最大和精度值是硬编码的。我应该把它作为指令并传递变量吗?或者功能更合适?
答案 0 :(得分:2)
我保持原样并添加自定义属性以传递最小值和最大值:
<div ng-controller="Numeric">
<br />
<input type="text" ng-model="number" required="required" class="numbers-only" minvalue="-27" maxvalue="45" />
</div>
在你的指令中(当然你应该有一些健全性检查和合理的默认值):
var min = parseInt(attrs.minvalue);
var max = parseInt(attrs.maxvalue);
我已经分道扬琴并在此处进行了更改:http://jsfiddle.net/XaqSs/
答案 1 :(得分:1)
一个可能的选择是完全回避自定义指令并使用input type = number属性。
<input type="number" min="5" max="18" step="0.5" value="9" name="shoe-size">
更多相关信息:http://html5doctor.com/html5-forms-input-types/
但并不是所有浏览器都支持它,而且firefox特别支持滞后:http://caniuse.com/#search=number