Так на вопрос «Как вычислить суммы без группировки», я знаю, вопрос старый, но так как я должен был сделать сам и не мог найти ничего я решил потратить некоторое время на это, и теперь я делюсь своим решением. Код SlickGrid будет ТОЛЬКО вычислять итоговые значения после группировки, это то, что, по моему мнению, являются агрегаторами, но я копаю код DataView и придумал решение, это несколько строк кода, но он отлично работает и использует Slick Aggregators, которые вы уже знают и уже определены. Я взял 2 функции из DataView, некоторые из них являются рядовыми, поэтому вам нужно также переписать их в свой код. Таким образом, конечный код - это 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"));
Это несколько строк кода, но в этом случае есть нет необходимости переписывать функцию, чтобы сделать сумму, другую - среднюю и т. д. ... Вы просто используете скотч-агрегаторы, которые вы уже используете, и это все .. просто :)
Можете ли вы поместить код своих столбцов в качестве параметра хорошо, я мог бы помочь вам, когда увижу это ..., а также код, который вызывает вашу группировку – ghiscoding
Вы пытаетесь получить общее количество для полного набора данных? – ghiscoding