【发布时间】:2015-10-24 09:00:25
【问题描述】:
我有几个表单字段需要以美元 ($n.nn) 显示,并且已成功使用自定义货币指令。但是我添加了 NgModelOptions 来控制去抖动:
{ updateOn: '默认模糊', debounce: { 'default':100, 'blur': 0 } }"
这可以正常工作,除非字段更新然后快速退出,在这种情况下会显示先前的值。输入然后离开该字段将导致显示正确的值。
关于如何将指令或货币过滤器与 NgModelOptions 组合以便显示的值反映退出时的模型值的任何想法?
这是当前指令:
.directive('ngCurrency', function ($filter, $locale) {
return {
require: 'ngModel',
scope: {
min: '=min',
max: '=max',
ngRequired: '=ngRequired'
},
link: function (scope, element, attrs, ngModel) {
function decimalRex(dChar) {
return RegExp("\\d|\\" + dChar, 'g');
}
function clearRex(dChar) {
return RegExp("((\\" + dChar + ")|([0-9]{1,}\\" + dChar + "?))&?[0-9]{0,2}", 'g');
}
function decimalSepRex(dChar) {
return RegExp("\\" + dChar, "g");
}
function clearValue(value) {
value = String(value);
var dSeparator = $locale.NUMBER_FORMATS.DECIMAL_SEP;
var clear = null;
if (value.match(decimalSepRex(dSeparator))) {
clear = value.match(decimalRex(dSeparator))
.join("").match(clearRex(dSeparator));
clear = clear ? clear[0].replace(dSeparator, ".") : null;
}
else if (value.match(decimalSepRex("."))) {
clear = value.match(decimalRex("."))
.join("").match(clearRex("."));
clear = clear ? clear[0] : null;
}
else {
clear = value.match(/\d/g);
clear = clear ? clear.join("") : null;
}
return clear;
}
ngModel.$parsers.push(function (viewValue) {
cVal = clearValue(viewValue);
return parseFloat(cVal);
});
element.on("blur", function () {
element.val($filter('currency')(ngModel.$modelValue));
scope.$apply();
});
ngModel.$formatters.unshift(function (value) {
return $filter('currency')(value);
});
scope.$watch(function () {
return ngModel.$modelValue;
}, function (newValue, oldValue) {
runValidations(newValue);
});
function runValidations(cVal) {
if (!scope.ngRequired && isNaN(cVal)) {
return;
}
if (scope.min) {
var min = parseFloat(scope.min);
ngModel.$setValidity('min', cVal >= min);
}
if (scope.max) {
var max = parseFloat(scope.max);
ngModel.$setValidity('max', cVal <= max);
}
}
}
}
})
【问题讨论】:
-
更多信息会很棒。也许是您的过滤器代码以及您如何显示字段值?
-
@Itmar - 是的,我没有付出太多。我认为这与更新前查看 $modelValue 的过滤器/指令有关。我将修改问题以包含指令。
标签: angularjs filter currency directive