当前位置: 首页 > 面试题库 >

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

高豪
2023-03-14
问题内容

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

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

我来了$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"), ''));
            });
        }
    };
});

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

有没有一种方法可以确保在不设置变量的情况下格式化文本字段?我猜我在寻找的是文本字段过滤器,但是我看不到任何内容。

最好的祝福


问题答案:

这是一个小提琴,显示了我如何在应用程序中实现完全相同的行为。最后我用ngModelController#render的不是$formatters,再加入一组独立的行为,关于触发keydownchange事件。

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



 类似资料:
  • 问题内容: 我尝试编写一个小指令,以将其内容包装在另一个模板文件中。 这段代码: 应该有以下输出: 因为布局“默认”具有以下代码: 这里的指令代码: }); 我的问题: 例如,当我在模板(在布局模板中或在布局标签内部)中使用范围变量时。它只是最初工作。如果我更新变量,则该指令不再更新。整个链接功能只会被触发一次。 我认为,AngularJS不知道,该指令使用范围变量,因此不会被更新。但是我不知道如

  • 问题内容: 我不确定这是这样做的方法,但是我的目标是: 我有一个家长指令 在父指令的代码块中,我有一个子指令,它将从用户那里获得一些输入 子指令将在父指令的范围内设置一个值 我可以从那里拿走 当然,问题在于父和子指令是同级的。所以我不知道该怎么做。注意-我不想在 小提琴:http : //jsfiddle.net/rrosen326/CZWS4/ 的HTML: Java脚本 问题答案: 如果要进行

  • 问题内容: 我想使用带格式的数字输入来在用户键入大数字时向用户显示千位分隔符。这是我使用的指令代码: http //jsfiddle.net/LCZfd/3/ 当我使用它时有效,但是当我要使用它时,当用户键入大数字时,它会被某些东西奇怪地清除。 有什么问题? 问题答案: 如注释中所述,除数字,小数点分隔符(通常或取决于语言环境)和或之外,什么都不支持。您仍然可以 输入 任何内容,但是浏览器将丢弃任

  • 问题内容: 我有一个从或指令属性或任何其他属性中获得的字符串,我想基于此在作用域上创建一个变量。所以: 但是,如果字符串包含一个或多个点,我想将其拆分并实际上“向下钻取”到作用域中。所以应该成为。这意味着简单版本不起作用! 在读取基于字符串的变量时,您可以通过做来获得这种行为,但是在分配值时如何实现呢? 问题答案: 我发现的解决方案是使用$ parse。 “将Angular表达式转换为函数。” 如

  • 问题内容: 我正在写指令,并且需要注意父作用域的更改。不知道我是否正在按照首选方式执行此操作,但是它不能与以下代码一起使用: 它记录了窗口加载,但是即使更改了overlaytype,也不会再次登录。 我怎样看待变化? 编辑:这是整个指令。不确定我为什么要使用儿童镜 问题答案: 您应该在子作用域上具有 data 属性,作用域在父作用域和子作用域之间使用原型继承。 同样, $ watch 方法期望的第

  • 本章介绍当模板在访问变量时发生了什么事情,还有变量是如何存储的。 当调用 Template.process 方法时,它会在方法内部创建一个 Environment 对象,在 process 返回之前一直使用。 该对象存储模板执行时的运行状态信息。除了这些,它还存储由模板中指令,如 assign, macro, local 或 global 创建的变量。 它不会尝试修改传递给 process 的数据