![](/img/trans.png)
[英]Why NgModelController.$modelValue != $parse(attrs.ngModel)(scope)?
[英]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
在幕后做的幾乎是以下列表:
$viewvalue
。 $viewValue
傳遞給當前的$parser
函數 $parser
函數的結果; 將它傳遞給下一個。 $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.