Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用SlickGrid和DataView在不分组的情况下计算总计?_Javascript_Jquery_Grouping_Slickgrid_Dataview - Fatal编程技术网

Javascript 如何使用SlickGrid和DataView在不分组的情况下计算总计?

Javascript 如何使用SlickGrid和DataView在不分组的情况下计算总计?,javascript,jquery,grouping,slickgrid,dataview,Javascript,Jquery,Grouping,Slickgrid,Dataview,我尝试使用Slick Grid和DataView计算列总数,如本例所示:。但是,我不想对行进行分组,因此我尝试不将getter和formatter传递给dataView.setGrouping(..)方法,但在我的表中,它显示了带有文本“undefined”的分组行。它确实正确地计算了我的总数。如何消除不必要的分组行 这就是我正在尝试的: dataView.setGrouping({ aggregators: [ new Slick.Data.Aggregators.Su

我尝试使用Slick Grid和DataView计算列总数,如本例所示:。但是,我不想对行进行分组,因此我尝试不将getter和formatter传递给dataView.setGrouping(..)方法,但在我的表中,它显示了带有文本“undefined”的分组行。它确实正确地计算了我的总数。如何消除不必要的分组行

这就是我正在尝试的:

dataView.setGrouping({
    aggregators: [
        new Slick.Data.Aggregators.Sum('someField1'),
        new Slick.Data.Aggregators.Sum('someField2')
    ]
});
因此,对于“如何在不分组的情况下计算总数”这个问题,我知道这个问题已经很老了,但因为我不得不自己做,而且找不到任何有效的方法,所以我决定花一些时间在这个问题上,现在我正在分享我的解决方案。SlickGrid的代码只会在分组后计算总数,我想这就是聚合器的用途,但我挖掘了DataView代码并提出了一个解决方案,虽然只有几行代码,但它非常有效,并且使用了您已经知道并且已经定义的Slick聚合器。我从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]
  };
}

这是几行代码,但这样就不需要重写一个函数来求和,另一个函数来求平均,等等。。。您只需使用您已经使用过的灵活聚合器,就可以了。。很简单:)

你能把你的栏目代码也放在选项里吗,我看到后也许能帮你。。。以及触发分组的代码。您是否正在尝试获取完整数据集的总数?
// 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"));