我是最佳实践的坚定倡导者,尤其是在角度方面,但我无法使用全新的$validators
管道功能应有的样子。
情况非常简单:1 个输入通过指令增强,使用$parser
, $formatter
还有一些$validators
:
<input name="number" type="text" ng-model="number" number>
这是(简化的)指令:
myApp.directive('number', [function() {
return {
restrict: 'A',
require: 'ngModel',
/*
* Must have higher priority than ngModel directive to make
* number (post)link function run after ngModel's one.
* ngModel's priority is 1.
*/
priority: 2,
link: function($scope, $element, $attrs, $controller) {
$controller.$parsers.push(function (value) {
return isFinite(value)? parseInt(value): undefined;
});
$controller.$formatters.push(function (value) {
return value.toString() || '';
});
$controller.$validators.minNumber = function(value) {
return value && value >= 1;
};
$controller.$validators.maxNumber = function(value) {
return value && value <= 10;
};
}
};
}]);
我做了一个小玩意儿:) http://plnkr.co/edit/iUbUCfJYDesX6SNGsAcg?p=preview
我想要实现的行为是:考虑到存储在范围中的初始值是有效的,如果用户输入无效,请防止其被破坏。保留旧的,直到设置新的有效的。
注意:在 Angular 1.3 之前,我可以使用ngModelController
API直接在$parser/$formatter
。我仍然可以使用 1.3 做到这一点,但这不会是“角度方式”。
NB2:在我的应用程序中,我并没有真正使用数字,但是数量 https://github.com/gentooboontoo/js-quantities.问题还是一样。