AngularJS指令数字格式屏蔽

时间:2013-11-08 14:28:30

标签: angularjs angularjs-directive masking angularjs-filter

我创建的指令使用函数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/
感谢。

4 个答案:

答案 0 :(得分:16)

我们在这里使用了$formatters.unshift$filter

enter image description here

<强> 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();
});

Updated fiddle

有关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));
});