angularjs - 使用 AngularJS 指令格式化输入字段,同时保持范围变量不变

我在格式化输入字段时遇到问题,而基础范围变量未格式化。

我想要实现的是一个显示货币的文本字段。它应该在处理错误输入时即时格式化自己。我得到了这个工作,但我的问题是我想将非格式化值存储在我的范围变量中。输入的问题在于它需要一个双向的模型,因此更改输入字段会更新模型,反之亦然。

我遇到了 $parsers$formatters 这似乎是我正在寻找的东西。不幸的是,它们并没有相互影响(这实际上可能有助于避免无限循环)。

我创建了一个简单的jsFiddle:http://jsfiddle.net/cruckie/yE8Yj/,代码如下:

HTML:

<div data-ng-app="app" data-ng-controller="Ctrl">
    <input type="text" data-currency="" data-ng-model="data" />
    <div>Model: {{data}}</div>
</div>

JS:

var app = angular.module("app", []);

function Ctrl($scope) {
    $scope.data = 1234567;
}

app.directive('currency', function() {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, element, attr, ctrl) {

            ctrl.$formatters.push(function(modelValue) {
                return modelValue.toString().replace(/\B(?=(?:\d{3})+(?!\d))/g, ',');
            });

            ctrl.$parsers.push(function(viewValue) {
                return parseFloat(viewValue.replace(new RegExp(",", "g"), ''));
            });
        }
    };
});

同样,这只是一个简单的例子。当它加载时,一切看起来都像它应该的那样。输入字段已格式化,变量未格式化。但是,当更改输入字段中的值时,它不再格式化自身 - 但是变量会正确更新。

有没有办法确保文本字段被格式化而变量不是?我想我正在寻找的是文本字段的过滤器,但我看不到任何东西。

最好的问候

最佳答案

这是一个 fiddle ,展示了我如何在我的应用程序中实现完全相同的行为。我最终使用了 ngModelController#render 而不是 $formatters,然后添加了一组单独的在 keydownchange 上触发的行为 事件。

http://jsfiddle.net/KPeBD/2/

https://stackoverflow.com/questions/19094150/

相关文章:

postgresql - 如何将 "1 day 01:30:00"之类的间隔转换为 "25:30:0

python - 在 Python 中格式化电话号码的最佳方法是什么?

c# - 您如何将 { 和 } 放入格式字符串中

android - 在 Android 的 textview [ Html.fromhtml() ]

c# - 用年份格式化 TimeSpan

html - 在每个标记属性上换行并在 Visual Studio HTML 代码编辑器中保持对齐

django - 是否有 django 模板过滤器来显示百分比?

r - 如果我已经有 y 刻度,则用逗号(和 K?MM?)格式化 ggplot2 轴标签

intellij-idea - 在 PyCharm 中用换行符包装注释

javascript - 在 JavaScript 中将十六进制数字格式化为短 UUID