簡體   English   中英

我必須繞開ngModelController。$ parsers來存儲值

[英]I have to circumvent ngModelController.$parsers to store a value

我剛剛打開了一個關於ngModelController。$解析器如何在Chrome,Safari或FireFox上不起作用錯誤報告 但是,我正在處理的應用程序提示輸入錯誤報告仍然是一個正在進行的項目,我需要為其找到一種解決方法。

由於該錯誤,以下代碼不起作用 這段代碼使用jQuery Masked Input以及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 話雖這么說,但我不確定是否缺少我需要意識到的任何微妙之處。 希望這可以讓我度過難關,直到找到bug並找到更好的解決方法,或者修改Angular團隊管理的bug。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM