指令$ formatters在写入时影响ngModel

Jer*_*606 5 javascript angularjs angularjs-directive

我有一个问题是使用$ formatters.

我的目标是隐藏电话号码,只留下最后4个字符.如果你不在输入中写任何东西就没问题.如果你写的东西,模型会受到掩码的影响,我在DB中注册隐藏的手机......

这是我使用的指令:

.directive('tsHideField', function () {
return {
    require: 'ngModel',
    restrict: 'A',
    link: function (scope, element, attributes, controller) {

        var maskValue = function (value) {
            if (!value) {
                return "";
            }
            if (value.length <= 4) {
                return value;
            }
            var valueHide = "";
            if (value.indexOf('@') === -1) {
                //leave last 4 chars
                valueHide = value.toString().substring(0, value.length - 4).replace(/[\S]/g, "\u2022");
                return valueHide + value.toString().substring(value.length - 4);
            } else {
                //Adresse email, on laisse après le @ et on cache tout sauf les 4 dernières lettre avant
                //'lambertjer@gmail.com'.substring(0,'lambertjer@gmail.com'.indexOf('@') - 4).replace(/[\S]/g, "\u2022") + 'lambertjer@gmail.com'.substring('lambertjer@gmail.com'.indexOf('@') - 4)
                valueHide = value.toString().substring(0, value.indexOf('@') - 4).replace(/[\S]/g, "\u2022");
                return valueHide + value.toString().substring(value.indexOf('@') - 4);
            }

            // replace all characters with the mask character
            //return (value || "").replace(/[\S]/g, "\u2022");
        }

        /** SI ON VEUT EGALEMENT CACHER A L ECRIT:
         * 
         * var createMaskedInputElement = function() {
            if (! maskedInputElement || ! maskedInputElement.length) {
                maskedInputElement = element.clone(true);
                maskedInputElement.attr("type", "password"); // ensure the value is masked
                maskedInputElement.removeAttr("name"); // ensure the password save prompt won't show
                maskedInputElement.removeAttr("core.application.main.directive.mask"); // ensure an infinite loop of clones isn't created
                maskedInputElement.bind("blur", function() {
                    element.removeClass("ng-hide");
                    maskedInputElement.remove();
                    maskedInputElement = null;
                });
                $compile(maskedInputElement)(scope);
                element.after(maskedInputElement);
            }
        };

        element.bind("focus", function() {
            createMaskedInputElement();
            element.addClass("ng-hide");
            maskedInputElement[0].focus();
        });
         */

        controller.$formatters.push(function (value) {
            return maskValue(value);
        });

    }
};
});
Run Code Online (Sandbox Code Playgroud)

对于您的设施,这里有一个小小的实现小提琴:http: //jsfiddle.net/nqp4qtLk/2/

如何防止模型受到面具的影响?

编辑:我根据我的要求调整Gr3g的答案

看到更新的小提琴:更新小提琴

gr3*_*r3g 2

请参阅我编辑的小提琴:

如果您不允许删除*:
Fiddle

如果您允许删除*:
Punker

注意:
如果您允许删除 *,您将在 plunker 中看到我不允许以下内容:
- 当数字可见时删除星号。
- 在 2 颗星之间或在第一个位置添加一个数字。

代码已经长大,所以我只能在这里向您展示部分代码。
显然,您需要$parsers管道:

controller.$parsers.push(function(val){
 //Modify your value
 return modifiedValue || val;
});
Run Code Online (Sandbox Code Playgroud)

请注意,我在每个管道中添加了 2 个函数,以便我可以在需要修改值的函数中访问字符串。我不必(太多)关心演员阵容。

controller.$parsers.unshift(function(val){
  return String(val);
});
Run Code Online (Sandbox Code Playgroud)

您可能可以使其更快,但在重构时要小心,考虑要处理的所有可能性。特别是当 * 可以被删除时。