自定义指令在没有小数时更改输入类型数字格式

时间:2017-10-17 21:07:54

标签: angularjs

我试图更改ngModel(输入类型="数字")格式。 When there is no decimal the Output must be: 25,00。如您所见,此代码在angularjs 1.2.23版本中工作良好,但在1.6.4版本中无效。任何其他解决方案?



var app= angular.module('myApp',[]);
app.controller('myCtrl',function($scope){
    $scope.test=25;
})

.directive('price', function($filter) {
    return {
       restrict: 'A',
       require: '?ngModel',
       link: function(scope, element, attrs, ngModel) {
           ngModel.$formatters.push(function (value) {
                return $filter('number')(value,2);
           });
       }
    }
})

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="myCtrl">
    <input type="number" ng-model="test" step=".01" price>
</div>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

从AngularJS 1.3(db044c40)开始,当输入不是数字时,类型input[number]会抛出验证错误,这是您的情况,因为数字过滤器返回一个字符串。

如果使用Number(...)parseFloat将其转换为数字,则对于浮点数的Javascript限制,其中最右边的零被删除,输入将显示值{{1而不是25

自此验证is also in the $formatters array以来,一个简单的解决方法是在添加自定义格式化程序时使用25.00而不是unshift,这样可以在之后运行验证:

push

当然,如果您的格式化工需要做一些额外的工作,您可以.directive('price', function($filter) { return { restrict: 'A', require: '?ngModel', link: function(scope, element, attrs, ngModel) { ngModel.$formatters.unshift(function (value) { return $filter('number')(value,2); }); } } }) 一个处理无效输入,push另一个通过调用unshift来添加小数位。