使用 sap.ui.table.Table 就像 PowerPivot 表一样
Use sap.ui.table.Table like PowerPivot table
我有一个包含这些值的表:
var aTableData = [
{Product: "A", Sales:120, Group:"001"},
{Product: "A", Sales:82, Group:"002"},
{Product: "B", Sales:10, Group:"002"},
{Product: "C", Sales:14, Group:"001"},
{Product: "A", Sales:8, Group:"001"},
{Product: "A", Sales:39, Group:"001"},
{Product: "B", Sales:3, Group:"002"},
{Product: "C", Sales:2, Group:"001"},
{Product: "D", Sales:1002, Group:"003"},
];
我希望用户通过分面筛选器分组选项进行选择,就像在 PowerPivot 表中一样。例如,如果用户选择"产品",则返回的表应如下所示:
var aTableData = [
{Product: "A", Sales:249},
{Product: "B", Sales:13},
{Product: "C", Sales:16},
{Product: "D", Sales:1002},
];
但是,如果用户选择"产品和组",则表应如下所示:
var aTableData = [
{Product: "A", Sales:167, group: "001"},
{Product: "A", Sales:82, group: "001"},
{Product: "B", Sales:13, group: "002"},
{Product: "C", Sales:16, group: "001"},
{Product: "D", Sales:1002, group: "003"},
];
目前我只能过滤一个方面,过滤器只工作一次(因为我正在覆盖表数据)。那么,这个"PowerPivot"背后的逻辑应该是如何筛选一个或两个以上的值,是否可以使用筛选器和分组来做到这一点(这样我就不需要覆盖表数据)?
我已经将我的代码复制到了 jsbin。
捷轩
聚合绑定的分组不支持任何聚合函数,如 sum。所以我想你必须自己做这一切。
我建议使用 $.ajax 调用(或使用专用模型)加载未聚合的数据,并将其保存在控制器或组件的成员中。然后将带有一些 JavaScript 行的数据聚合到一个副本中,并将其分配给绑定表的JSONModel
。
使用这样的算法,您可以重用groupBy
函数:
var fnAggregate = function(aItems){
var result = aItems[0];
result.Sales = aItems.reduce(function(prev, curr){ return prev+curr.Sales;},0);
return result;
};
var groupBy = function(aData, fnKey, fnAggregate){
var map = {};
aData.forEach(function(item){
var key = fnKey(item);
if (!(key in map)){
map[key] = [];
}
map[key].push(item);
});
var result = [];
for(key in map){
result.push(fnAggregate(map[key]));
}
return result;
};
在您的handleSelect
功能中,您可以使用它们
var fnKey = function(item){
return selectedKeysArray.map(function(key){ return item[key]; }).join(";");
};
var groupedTableData = groupBy(aTableData, fnKey, fnAggregate);
var oTable = sap.ui.getCore().byId("Table_ID");
var oTableModel = oTable.getModel().setProperty("/modelData", groupedTableData);
这是您修改后的 jsbin .
相关文章:
- 使用向下箭头键(与tab键一样)聚焦下一个输入
- 在SVG地图上添加水的渐变,就像在谷歌地图(PHP/JS)中一样
- 如何像模糊图像一样模糊iframe
- FullCalendar:事件发生时阻止重叠.标题是一样的
- 如何检测滚动事件是否像在触摸设备上一样只触发一次
- DIV怎么能像Javascript中的另一个元素一样工作呢
- 我正在创建一个聊天,但每次我发送消息时,它都不会让我再发送另一条消息,就像表格一样;不起作用
- 有没有8个谜题和15个谜题一样无法解决
- 如何缩放像图像一样的元素
- 我需要iframe的内容像动画一样展开,填满整个屏幕并缩小到原来的大小
- 是否可以像字符串一样/操作/函数
- 我可以像其他库一样将JointJS作为AngularJS模块注入吗
- 为什么可以'我们在函数体中为函数对象添加属性,就像在javascript中为对象文字添加属性一样
- 我如何创建一个选择器,就像jQuery有jQuery()或$()一样
- 为什么'这两根绳子不一样吗
- 为什么答案是一样的
- 像谷歌一样更改滚动网站
- 试图清理一个电话号码,以便如果它像816-345-6757一样被输入,它会像8163456757一样返回它
- 如何在javascript对象中设置属性的类型,就像mongoose模式设计一样
- 使用 sap.ui.table.Table 就像 PowerPivot 表一样