我创建的指令使用函数setFormatting来屏蔽输入字段中的文本值。
scope.$watch(element, function() {
modelCtrl.$setViewValue(setFormatting(element.val(), attrs.symbol));
modelCtrl.$render();
});
element.bind('blur', function() {
modelCtrl.$setViewValue(setFormatting(element.val(), attrs.symbol));
modelCtrl.$render();
});
范围。$ watch在第一次加载/应用内容时应用蒙版,element.bind为其他时间应用蒙版。范围。$ watch存储符号(如果有的话)作为ng-model变量的一部分。 element.bind不是。我以为$ setViewValue()和$ render()没有更新ng-model变量。变量在哪里更新?
请参阅随附的小提琴:http://jsfiddle.net/PJ3M4/
感谢。
答案 0 :(得分:16)
我们在这里使用了$formatters.unshift
和$filter
:
<强> JS 强>
var fessmodule = angular.module('myModule', []);
fessmodule.controller('fessCntrl', function ($scope) {
$scope.test = 123456879;
});
fessmodule.$inject = ['$scope'];
fessmodule.directive('format', ['$filter', function ($filter) {
return {
require: '?ngModel',
link: function (scope, elem, attrs, ctrl) {
if (!ctrl) return;
var symbol = "°"; // dummy usage
ctrl.$formatters.unshift(function (a) {
return $filter(attrs.format)(ctrl.$modelValue) + symbol;
});
ctrl.$parsers.unshift(function (viewValue) {
var plainNumber = viewValue.replace(/[^\d|\-+|\.+]/g, '');
elem.val($filter('number')(plainNumber) + symbol);
return plainNumber;
});
}
};
}]);
<强> HTML 强>
<input type="text" ng-model="test" format="number"/>
演示 Fiddle
作为旁注
你也可以找到这个:Fiddle
答案 1 :(得分:1)
$watch
在'摘要'循环中执行。 element.bind
回调是从外部角度调用的,因此您必须添加对scope.$apply()
的显式调用:
element.bind('blur', function() {
modelCtrl.$setViewValue(setFormatting(element.val(), attrs.symbol));
modelCtrl.$render();
scope.$apply();
});
有关AngularJS's event loop的信息,请参阅文档。
答案 2 :(得分:1)
您也可以使用
ui-mask="{{'999,999,999°'}}"
答案 3 :(得分:0)
我能够通过在我的范围中添加一个modelCtrl。$ parsers.push(){...}来获得ng-model以我想要的方式存储值。$ watch(){...}。
scope.$watch(element, function() {
modelCtrl.$parsers.push(function(inputValue) {
showAlert("Watch", 1);
if (!prev) {
prev = false;
var returnVal = checkVal(inputValue, modelCtrl, decimals, true, minVal, maxVal);
if (String(returnVal) === ".") {
setAndRender(modelCtrl, "");
return "";
}
else {
return returnVal;
}
}
return String(inputValue).replace(/[^0-9 . -]/g, '');
});
prev = true;
setAndRender(modelCtrl, setFormatting(element.val(), decimals, attrs.prefix, attrs.symbol));
});