如何在UI Grid中获取自定义聚合总计及指定行求和
如何在UI Grid中实现特定行的自定义总计
当然可以实现!在UI Grid里针对指定行计算自定义总计完全没问题,你提到的customTreeAggregationFn和customTreeAggregationFinalizerFn正是实现这个需求的核心方法,下面我给你一步步拆解具体怎么做:
核心实现思路
我们需要通过自定义聚合函数,在遍历表格行的时候筛选出目标姓名的行,只对这些行的数值进行累加,最后把结果渲染到总计行里。
具体代码示例
假设你的表格有姓名和金额两列,我们要给金额列配置自定义聚合:
// 假设你已经初始化了AngularJS和UI Grid的依赖 angular.module('app', ['ui.grid']) .controller('GridController', ['$scope', 'uiGridConstants', function($scope, uiGridConstants) { // 模拟表格数据 $scope.gridOptions = { columnDefs: [ { name: 'name', displayName: '姓名' }, { name: 'amount', displayName: '金额', // 指定使用自定义聚合类型 aggregationType: uiGridConstants.aggregationTypes.custom, // 自定义聚合逻辑:筛选目标行并累加 customTreeAggregationFn: function(aggregation, fieldValue, numValue, row) { // 定义需要求和的目标姓名 const targetNames = ['Terry Clay', 'Nieves Mack']; // 检查当前行是否属于目标姓名,是则累加金额 if (targetNames.includes(row.entity.name)) { // 处理空值或非数值情况,避免NaN const valueToAdd = isNaN(numValue) ? 0 : numValue; aggregation.value = (aggregation.value || 0) + valueToAdd; } }, // 最终处理聚合结果,渲染到总计行 customTreeAggregationFinalizerFn: function(aggregation) { aggregation.rendered = `总计: ${aggregation.value || 0}`; } } ], // 模拟数据,替换成你的实际数据 data: [ { name: 'Terry Clay', amount: 100 }, { name: 'Nieves Mack', amount: 200 }, { name: 'Other User', amount: 150 }, { name: 'Terry Clay', amount: 50 } ], // 开启总计行显示 showFooter: true, enableColumnMenus: false }; }]);
关键代码解释
customTreeAggregationFn:这个函数会逐行处理表格数据,我们在这里加入了姓名判断逻辑,只有当行的姓名是Terry Clay或Nieves Mack时,才会把该行的金额数值累加到aggregation.value中。同时加入了空值处理,避免出现NaN的情况。customTreeAggregationFinalizerFn:这个函数负责将最终的累加结果格式化后,赋值给aggregation.rendered,这样总计行就会显示我们需要的自定义总计文本。showFooter: true:必须开启这个配置,UI Grid才会显示总计行。
额外注意事项
- 确保你的行数据中的字段名和代码里的
name、amount对应,如果字段名不同,需要同步修改代码里的引用。 - 如果需要扩展筛选条件(比如根据多个字段判断),只需要在
customTreeAggregationFn里增加对应的判断逻辑即可。 - 如果要处理更复杂的数值计算(比如取平均值、最大值),也可以在这个框架下修改聚合逻辑。
内容的提问来源于stack exchange,提问作者Nimchip
相关产品推荐
相关产品推荐

