По-видимому, поведение механизма синтаксического анализа ngModelController изменилось между Angular 1.2 и 1.3. Теперь я всегда вижу новый ключ проверки с именем 'parse'
, добавленный ко всем объектам $error
, и всякий раз, когда один из парсеров возвращает undefined, он переопределяет/заменяет все другие ключи проверки, которые могут быть уже установлены.
Например, вот рабочий пример в Angular 1.2.23 - попробуйте ввести число вне диапазона:
http://jsfiddle.net/8doq0saf/5/
То же самое, что работает под 1.3-rc, дает другой результат:
http://jsfiddle.net/1t52s9b2/4/
Я еще не смог найти документацию об этом изменении. Какова цель ключа синтаксического анализа и как я могу изменить свой код, чтобы вернуть прежнее поведение?
angular.module('app', []).directive('number', function () {
return {
require: 'ngModel',
link: function (scope, elem, attrs, ctrl) {
// valid number
ctrl.$parsers.push(function (value) {
var valid = angular.isUndefined(value) || value === '' || isFinite(value);
ctrl.$setValidity('number', valid);
return valid
? angular.isUndefined(value) || value === '' ? undefined : Number(value)
: undefined;
});
ctrl.$parsers.push(function (value) {
if (!angular.isDefined(attrs.minNumber)) {
return value;
}
var valid = angular.isUndefined(value) || Number(value) >= Number(attrs.minNumber);
ctrl.$setValidity('minNumber', valid);
return valid ? value : undefined;
});
ctrl.$parsers.push(function (value) {
if (!angular.isDefined(attrs.maxNumber)) {
return value;
}
var valid = angular.isUndefined(value) || Number(value) <= Number(attrs.maxNumber);
ctrl.$setValidity('maxNumber', valid);
return valid ? value : undefined;
});
}
};
});