请求AngularJS基于动态参数实现字段格式化的解决方案
解决AngularJS动态指定格式化过滤器的问题
嗨,针对你遇到的动态绑定格式化规则的需求,我给你两个实用的解决思路,都能完美适配你的场景:
方法一:自定义通用动态过滤器
这是最推荐的方案,符合AngularJS的过滤器设计思路,复用性极强。我们可以创建一个自定义过滤器,接收data和format参数,解析后调用对应的内置过滤器:
代码实现
function TodoCtrl($scope) { $scope.data = '1234567'; $scope.format = 'number:2'; } // 注册自定义动态过滤器 angular.module('app', []) .filter('dynamicFilter', ['$filter', function($filter) { return function(input, formatStr) { if (!input || !formatStr) return input; // 拆分过滤器名称和参数(比如把'number:2'拆成['number', '2']) var parts = formatStr.split(':'); var filterName = parts[0]; var filterArgs = parts.slice(1); // 检查是否存在对应的内置过滤器 var filter = $filter(filterName); if (filter) { // 把输入值和参数传给过滤器 return filter(input, ...filterArgs); } // 如果没有匹配的过滤器,返回原始值 return input; }; }]);
模板修改
把原来的注释部分替换成自定义过滤器的调用:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app="app" ng-controller="TodoCtrl"> <p> Data = <input type="text" ng-model="data" /> </p> <p> Format = <input type="text" ng-model="format" /> </p> <br /> <p> Unformatted data = {{data}} </p> <p> Formatted data = {{data | dynamicFilter:format}} </p> </div>
方法二:在控制器中实现格式化函数
如果你不想新增过滤器,也可以直接在控制器里写一个格式化函数,模板调用这个函数即可:
代码实现
function TodoCtrl($scope, $filter) { $scope.data = '1234567'; $scope.format = 'number:2'; // 定义格式化函数 $scope.formatData = function(input, formatStr) { if (!input || !formatStr) return input; var parts = formatStr.split(':'); var filterName = parts[0]; var filterArgs = parts.slice(1); var filter = $filter(filterName); return filter ? filter(input, ...filterArgs) : input; }; }
模板修改
直接调用控制器里的函数:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app ng-controller="TodoCtrl"> <p> Data = <input type="text" ng-model="data" /> </p> <p> Format = <input type="text" ng-model="format" /> </p> <br /> <p> Unformatted data = {{data}} </p> <p> Formatted data = {{formatData(data, format)}} </p> </div>
补充说明
- 两种方案都能处理你提到的
number:2和date:yyyy-MM-dd场景,比如当data='2013-12-10 23:59:00'、format='date:yyyy-MM-dd'时,会正确输出2013-12-10; - 如果需要支持多参数的过滤器(比如某些自定义过滤器需要多个参数),只需要修改参数拆分逻辑,把
split(':')后的数组全部传给过滤器即可; - 注意要处理
format为空或者不存在对应过滤器的情况,避免报错。
内容的提问来源于stack exchange,提问作者Derek Nigel Bartram
相关产品推荐
相关产品推荐

