2013-12-24 1 views
0

Я пытаюсь использовать Slick Grid и DataView для вычисления итогов столбцов, как в этом примере: http://mleibman.github.io/SlickGrid/examples/example-grouping. Тем не менее, я не хочу группировать свои строки, поэтому я попытался не передавать в getter и formatter метод dataView.setGrouping (..), но в моей таблице он показывает строку группировки с текстом «undefined». Он правильно вычисляет мои итоги. Как избавиться от ненужной группировки?Как использовать SlickGrid и DataView для вычисления итогов без группировки?

Это то, что я пытаюсь:

dataView.setGrouping({ 
    aggregators: [ 
     new Slick.Data.Aggregators.Sum('someField1'), 
     new Slick.Data.Aggregators.Sum('someField2') 
    ] 
}); 
+0

Можете ли вы поместить код своих столбцов в качестве параметра хорошо, я мог бы помочь вам, когда увижу это ..., а также код, который вызывает вашу группировку – ghiscoding

+0

Вы пытаетесь получить общее количество для полного набора данных? – ghiscoding

ответ

2

Так на вопрос «Как вычислить суммы без группировки», я знаю, вопрос старый, но так как я должен был сделать сам и не мог найти ничего я решил потратить некоторое время на это, и теперь я делюсь своим решением. Код 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")); 

Это несколько строк кода, но в этом случае есть нет необходимости переписывать функцию, чтобы сделать сумму, другую - среднюю и т. д. ... Вы просто используете скотч-агрегаторы, которые вы уже используете, и это все .. просто :)

 Смежные вопросы

  • Нет связанных вопросов^_^