2016-03-18 46 views
1

我剛剛打開了一個bug report about how ngModelController.$parsers does not work on Chrome, Safari, or FireFox。但是,我正在開發的應用程序提示您輸入錯誤報告仍然是一個正在進行的項目,而且我需要找到一個解決方法。

以下代碼不是工作由於該錯誤。此代碼使用jQuery Masked Input以及角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); 
    }); 
} 

不過,我真的不知道任何其他方式來應用當前$viewValue到模型,而無需使用ngModelController.$parser功能。我正在考慮做這樣的事情:

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

    // Something with digitsOnly? 
}); 

...作爲一個臨時的解決方法,但我不知道究竟該做什麼。

問題:從指令直接向模型應用值有哪些選擇?

回答

0

我發現了一個工作。非常多...你必須蠻力這種事情。

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團隊管理的錯誤。