【问题标题】:Angularjs create input maskAngularjs创建输入掩码
【发布时间】:2016-10-08 21:32:43
【问题描述】:

我正在尝试创建一个指令来为我的输入创建自定义掩码。我知道我可以使用其他库,但有时我需要根据公司需要自定义输入(例如“OS.012-08765”),所以我宁愿创建自己的指令。

到目前为止,我能够在我需要的模式上格式化数字,但不能在输入上,只能在模型上。对于这个例子,我将使用资金输入,因为它更容易使用(我认为)。这是我正在使用的代码:

function myMoney() {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function(scope, element, attr, ngModelCtrl) {
            ngModelCtrl.$formatters.push( formatInput );
            ngModelCtrl.$render = renderViewValue;
            ngModelCtrl.$parsers.push( parseOutput );


            function formatInput( value ) {
                value = formatNumber(value);
                return value;
            }
            function parseOutput( value ) {
                value = formatNumber(value);
                return value;
            }
            function renderViewValue() {
                element.html( ngModelCtrl.$viewValue );
            }

            function formatNumber(value) {
                if(!value) {
                    value = '000';
                }

                var checkValue = value.replace(/[^0-9\.]/g, '');
                if(checkValue != value) {
                    value = checkValue;
                }

                value = value.toString();

                if(value.length < 3) {
                    value = ('000'+value).slice(-3);
                }

                var 
                    firstChar = value.slice(0, value.length-2),
                    lastChar  = value.slice(-2),
                    firstChar = Number(firstChar).toLocaleString(),
                    finalChar = '$'+firstChar+','+lastChar;

                return finalChar;
            }
        }
    }
}

这是一个代码:http://plnkr.co/edit/UjZkPFL0V4FRrDUL9jAJ?p=preview


主要问题是输出在哪里,如果您开始在输入上输入,则该值没有掩码,只是数字。但是该模型具有适当的掩码。

因此,基于此,我有两个主要问题:

  • 首先:我想反转这些结果。我想在文本框中输入内容并在文本框中设置掩码,而模型只是纯数字(没有掩码)。
  • 第二:如果我创建一个按钮来更新模型上的值,它不会在掩码中格式化,而是保持纯文本。

我该如何解决这些问题?

【问题讨论】:

  • 你不能使用&lt;input placeholder="__.___-_____ "&gt; 吗?所以你不必担心用你的实际角色替换“_”。
  • 但是占位符的问题在于,它不会根据用户类型来填充,这正是我想要的。

标签: javascript angularjs


【解决方案1】:

尝试使用 ui 掩码 https://htmlpreview.github.io/?https://github.com/angular-ui/ui-mask/master/demo/index.html,在 Mask Definition 字段下输入 AA.999-99999 以匹配您的模式。

<input type="text" 
       ng-model="serviceOrderNumber" 
       ui-mask="AA.999-99999"  
       ui-mask-placeholder 
       ui-mask-placeholder-char="_"/>

【讨论】:

  • 就像我说的,我知道有我可以使用的库,但我想自己开发。关于如何做到这一点的任何想法?
  • 我明白了...如果您真的想跟踪占位符字符,则必须计算每个光标位置并将其替换为实际字符。不过,我将花费大量时间从头开始创建输入掩码。祝你好运!
  • 请参阅github.com/angular-ui/ui-mask/blob/master/dist/mask.js 以了解实施情况。你应该创建指令,需要'ngModel',通过链接函数访问ngModel控制器,重写它的一些逻辑($isEmpty()函数,有效性逻辑......),使用ngModelController的$formatters和$parsers来改变视图和模型ngModel 的值
  • @EdmarMiyake 我实际上不需要检查光标的位置等。但是例如,一旦用户开始输入,它将开始填充掩码。就像大多数货币掩码一样。您开始输入,当您只有一个数字时,输出将是“0.01”,在您输入更多后,它将是“149.65”
  • @Andriy 我已经在尝试对代码进行反向分析,但是如果您可以详细说明扩展您的评论解释的答案,那就太好了。此外,它不需要是复杂的掩码。一旦我掌握了基础知识,我想我就可以继续了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 2020-08-15
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多