我尝试使用Slick Grid和DataView计算列总数,如下例所示:http://mleibman.github.io/SlickGrid/examples/example-grouping。但是,我不想对我的行进行分组,因此我尝试不将getter和formatter传递给dataView.setGrouping(..)方法,但是在我的表中它显示了带有文本&#39的分组行。 ;未定义&#39 ;.它确实正确计算我的总数。如何摆脱不必要的分组行?
这就是我正在尝试的:
dataView.setGrouping({
aggregators: [
new Slick.Data.Aggregators.Sum('someField1'),
new Slick.Data.Aggregators.Sum('someField2')
]
});
答案 0 :(得分:2)
因此,对于“如何在没有分组的情况下计算总数”这个问题,我知道这个问题已经过时了,但由于我不得不自己找不到任何工作,所以我决定花一些时间在上面,现在我分享了解。 SlickGrid的代码只能在分组后计算总数,这就是聚合器的用途,但我挖掘了DataView代码并提出了一个解决方案,它是几行代码,但它运行良好,使用Slick Aggregators,你已经知道并且已经定义了。我从DataView中获取了2个函数,其中一些是私有函数,因此您需要在代码中重新复制它。所以最终的代码是1个函数名CalculateTotalByAggregator()
,它将在内部调用2个其他函数。
注意:请注意dataview.getItems()
,dataview
必须是来自您的代码的,并且可能拼写不同。
/** Calculate the total of an existing field from the datagrid
* @param object aggregator
* @return mixed total
*/
function CalculateTotalByAggregator(agg) {
var constructorName = agg.constructor.name; // get constructor name, ex.: SumAggregator
var type = constructorName.replace(/aggregator/gi, '').toLowerCase(); // remove the word Aggregator and make it lower case, ex.: SumAggregator -> sum
var totals = new Slick.GroupTotals();
var fn = compileAccumulatorLoop(agg);
fn.call(agg, dataview.getItems());
agg.storeResult(totals);
return totals[type][agg.field_];
}
/** This function comes from SlickGrid DataView but was slightly adapted for our usage */
function compileAccumulatorLoop(aggregator) {
aggregator.init();
var accumulatorInfo = getFunctionInfo(aggregator.accumulate);
var fn = new Function(
"_items",
" for (var " + accumulatorInfo.params[0] + ", _i=0, _il=_items.length; _i<_il; _i++) {" +
accumulatorInfo.params[0] + " = _items[_i]; " +
accumulatorInfo.body +
"}"
);
fn.displayName = "compiledAccumulatorLoop";
return fn;
}
/** This function comes from Slick DataView, but since it's a private function, you will need to copy it in your own code */
function getFunctionInfo(fn) {
var fnRegex = /^function[^(]*\(([^)]*)\)\s*{([\s\S]*)}$/;
var matches = fn.toString().match(fnRegex);
return {
params: matches[1].split(","),
body: matches[2]
};
}
然后在客户端,您只需要调用CalculateTotalByAggregator(agg)
函数和有效的Slick.Aggregators
对象,例如:
// use any valid Slick Aggregator object and pass it to the function
var agg = new Slick.Data.Aggregators.Sum("Hours");
var totalHours = gridObject.CalculateTotalByAggregator(agg);
// or on a 1 liner
var totalHours = gridObject.CalculateTotalByAggregator(new Slick.Data.Aggregators.Sum("Hours"));
这是几行代码,但是这样就不需要重写一个函数来进行求和,另一个来做平均等等......你只需使用你已经使用过的Slick Aggregators就可以了。简单:))