angularjs - 最小和最大的Angular JS指令表单输入验证
问题描述
嗨,我在验证最小和最大形式的输入时遇到了一些麻烦,我有以下内容。
我的表单输入:
<div class="input short" ng-if="input.tipo_simulacao.key == 2">
<input
name="valor_simulacao_t"
ng-model="input.valor_simulacao_t"
type="text"
required
ng-minlength="1"
min="0"
max="99.99"
ng-currency currency-symbol="%"
placeholder="Valor Simulação">
</input>
<span class="input-clear"
ng-model="input.valor_simulacao_t"
ng-click="input.valor_simulacao_t = null"
ng-show="form.valor_simulacao_t.$viewValue && input.valor_simulacao_t !== ''"
>×</span>
</div>
这是用于验证的 JS 指令:
vm.$watch('input.valor_simulacao_t', function (newValue, oldValue) {
if (vm.input.valor_simulacao_t && vm.form.valor_simulacao_t && $rootScope.user.taxa_inferior_protocolo < 1) {
console.log(vm.taxa_base);
console.log(newValue);
if (newValue > vm.taxa_base) {
vm.form.valor_simulacao_t.$setValidity('max', false);
} else if (newValue < vm.taxa_base) {
vm.form.valor_simulacao_t.$setValidity('min', false);
}
};
});
现在在输入中我设置了一个带有小数点的最小和最大属性,这是一个百分比字段。在指令中验证了用户详细信息能够具有低于 vm.taxa_base 变量的值,然后继续检查输入值是否高于 vm.taxa_base 值,如果高于则设置 max 属性无效,如果它小于 vm.taxa_base 值,则将 min 属性设置为无效。
我遇到的问题是,如果我将值与 9,60 之类的 % 的逗号分隔符放在一起,然后广告 % 它表示正确无效,因为 vm.taxa_base = 2.5 但是如果我插入一个类似于 15 的值而没有逗号或 15,00 将其设置为它不应该假设的有效值,因为在指令中我正在比较每个较小或较大的值。
提前感谢,因为我被困在这里。
好吧,在弄乱它之后,我发现这与 ng-currency 模块有关,因为我将其从输入中取出,min 和 max 验证器工作正常,但 ng-currency 格式化为 % ,它作为逗号分隔符该值以点分隔。
这是验证输入的观察者:
vm.$watch('input.valor_simulacao_t', function (newValue, oldValue) {
if (vm.input.valor_simulacao_t && vm.form.valor_simulacao_t && $rootScope.user.taxa_inferior_protocolo < 1) {
if (newValue > vm.taxa_base) {
console.log('Error Greater 2');
vm.form.valor_simulacao_t.$setValidity('max', false);
} else if (newValue < vm.taxa_base) {
console.log('Error Lesser 2');
vm.form.valor_simulacao_t.$setValidity('min', false);
} else {
console.log('Pass 2');
vm.form.valor_simulacao_t.$setValidity('max', true);
vm.form.valor_simulacao_t.$setValidity('min', true);
}
};
});
现在输入(指令):
<input
name="valor_simulacao_t"
ng-model="input.valor_simulacao_t"
type="text"
required
ng-minlength="1"
min="0"
max="99.99"
placeholder="Valor Simulação">
</input>
有没有办法以某种方式格式化数字以尊重百分比格式?
解决方案
好的,其中一种解决方案现在可以很好地进行验证。这是指令:
.directive('formatPercentage', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, elem, attr, ngModel) {
if (!ngModel) return;
elem.on('focusout', function() {
var str = elem.val();
elem.val(str + ' %');
});
elem.on('focus', function() {
var str = elem.val();
elem.val(str.substring(0, str.length - 2));
});
ngModel.$formatters.unshift(function () {
ngModel.$modelValue = parseFloat(ngModel.$modelValue).toFixed(2).replace('.', ',');
return (ngModel.$modelValue == 'NaN') ? '' : ngModel.$modelValue + ' %';
});
ngModel.$parsers.unshift(function (viewValue) {
return parseFloat(viewValue.replace(',', '.')).toFixed(2);
});
}
};
})
这是自定义指令的输入:
<input
name="valor_simulacao_t"
ng-model="input.valor_simulacao_t"
type="text"
required
ng-minlength="1"
min="0"
max="99.99"
format-percentage
placeholder="Valor Simulação"
autocomplete="off">
</input>
推荐阅读
- outlook-web-addins - 在应用商店上传清单文件时出现“remoteurl”错误
- javascript - 从节点js中的缓冲区检测文件类型?
- javascript - 解释在 Javascript ES6 中调用对象方法的函数中“this”的使用
- sql - SQL 仅替换路径的一部分
- regex - 过滤掉具有 3 个或更多子文件夹的行
- android - 如何将两个不同的 Firebase 帐户用户带到不同的活动中?
- java - apache tomcat 服务器总是运行一个程序的问题,它显示端口 8080 已经被使用..?
- java - Maven surefire 插件默认策略来运行测试
- c++ - Cmake确实找到了`A_library`,但是当`make`它告诉`library not found for A_library`?
- javascript - 如何在反应中显示损坏的 HTML?