我必须绕过ngModelController.$parsers来存储一个值

I have to circumvent ngModelController.$parsers to store a value

本文关键字:存储 一个 parsers ngModelController      更新时间:2023-09-26

我刚刚打开了一个关于ngModelController.$parsers如何在Chrome,Safari或FireFox上运行的错误报告。 但是,我正在处理的提示输入错误报告的应用程序仍然是一个正在进行的项目,我需要找到解决方法。

由于该错误,以下代码不起作用。 这段代码使用 jQuery 屏蔽输入以及 Angular 1.5:

link: function (scope, element, attrs, ctrl) {
    // Build mask.
    var mask = '99999?-9999';
    $(element).mask(mask);
    // Store all zip codes without non-digit characters
    // E.G.: 12345-6789 -> 123456789
    //       12345 -> 12345
    ctrl.$parsers.unshift(function (viewValue) {
        var nonDigitCharacters = /[^0-9]/g;
        var digitsOnly = viewValue.replace(nonDigitCharacters, '');
        return digitsOnly;
    });
    ctrl.$formatters.push(function (value) {
        return $filter('zip')(value, false);
    });
}

但是,我真的不知道任何其他方法可以在不使用ngModelController.$parser函数的情况下将当前$viewValue应用于模型。 我正在考虑做这样的事情:

$(element).on('keyup', function () {
    var nonDigitCharacters = /[^0-9]/g,
        digitsOnly = ctrl.$viewValue.replace(nonDigitCharacters, '');
    // Something with digitsOnly?
});

。作为临时解决方法,但我不知道具体该怎么做。

问题:将值从指令直接应用于模型有哪些选项?

我发现了一个解决方法。 几乎。。。你必须蛮力这种事情。

ngModelController.$parsers幕后所做的几乎是以下列表:

  1. 通过读取元素的值来获取当前$viewvalue
  2. $viewValue传递到当前$parser函数
  3. 获取该$parser函数的结果;将其传递给下一个函数。
  4. 重复直到完成。
  5. 将所有$parser函数的结果直接应用于模型。

。几乎,我不得不手动复制如下:

$(element).on('keyup', function() {
    ctrl.$setViewValue($(element).val());
    var nonDigitCharacters = /[^0-9]/g,
        digitsOnly = ctrl.$viewValue.replace(nonDigitCharacters, '');
    var model = $parse(attrs.ngModel),
        modelSetter = model.assign;
    scope.$apply(function () {
        modelSetter(scope, digitsOnly);
    });
});

这样做将允许您直接规避ngModelController.$parsers。 话虽如此,我不确定我是否缺少任何需要注意的微妙之处。 希望这可以让我度过难关,直到调查错误并找到更好的解决方法,或者修复 Angular 团队管理的错误。