我开发了几个指令,实际上限制用户设置无效值,而不是在提供无效值时简单地抛出错误。
这些指令也不需要 ngModel(尽管我怀疑你会在没有它们的情况下使用它们),真正酷的是 如果提供了这两个设置,它会将值环绕到最小值/最大值!
我已尝试尽可能简化指令,以使我们的读者更容易理解。
这是整个事情的 JSFiddle:JSFiddle
以下是指令:
app.directive('ngMin', function($parse){
return {
restrict: 'A',
link: function(scope, element, attrs){
function validate(){
if(element
&& element[0]
&& element[0].localName === 'input'
&& isNumber(attrs.ngMin)
&& isNumber(element[0].value)
&& parseFloat(element[0].value) < parseFloat(attrs.ngMin)){
if(isNumber(attrs.ngMax)){
element[0].value = parseFloat(attrs.ngMax);
if(attrs.hasOwnProperty("ngModel"))
$parse(attrs.ngModel).assign(scope, parseFloat(attrs.ngMax));
}
else {
element[0].value = parseFloat(attrs.ngMin);
if(attrs.hasOwnProperty("ngModel"))
$parse(attrs.ngModel).assign(scope, parseFloat(attrs.ngMin));
}
}
}
scope.$watch(function(){
return attrs.ngMin + "-" + element[0].value;
}, function(newVal, oldVal){
if(newVal != oldVal)
validate();
});
validate();
}
};
});
app.directive('ngMax', function($parse){
return {
restrict: 'A',
link: function(scope, element, attrs){
function validate(){
if(element
&& element[0]
&& element[0].localName === 'input'
&& isNumber(attrs.ngMax)
&& isNumber(element[0].value)
&& parseFloat(element[0].value) > parseFloat(attrs.ngMax)){
if(isNumber(attrs.ngMin)){
element[0].value = parseFloat(attrs.ngMin);
if(attrs.hasOwnProperty("ngModel"))
$parse(attrs.ngModel).assign(scope, parseFloat(attrs.ngMin));
}
else {
element[0].value = parseFloat(attrs.ngMax);
if(attrs.hasOwnProperty("ngModel"))
$parse(attrs.ngModel).assign(scope, parseFloat(attrs.ngMax));
}
}
}
scope.$watch(function(){
return attrs.ngMax + "-" + element[0].value;
}, function(newVal, oldVal){
if(newVal != oldVal)
validate();
});
validate();
}
};
});
...还有,你也需要这个小辅助函数:
function isNumber(n){
return !isNaN(parseFloat(n)) && isFinite(n);
}
要调用这些指令,只需将它们设置在type="number" 所在的输入框中:
<input ng-model="myModel" ng-min="0" ng-max="1024" />
应该这样做!
当您同时提供ngMin 和ngMax 时,这些指令会将值环绕,因此当您的值小于ngMin 时,它将设置为ngMax,反之亦然。
如果您只提供ngMin 或ngMax,则输入值将仅以这些值为上限。
我更喜欢这种防止错误值的方法,而不是提醒用户他们输入了错误值。