2015-02-20 2 views
0

У меня возникла проблема с функцией агрегата Kendo Grid, которую я не могу решить.Kendo Grid Aggregate только для текущей страницы

У меня есть ряд строк, содержащих числовые значения. В нижней части сетки я хочу отобразить сумму строк.

Это уже работает, как показано в этой скрипке:

http://jsfiddle.net/0Ly94e49/

$(document).ready(function() { 
$("#grid").kendoGrid({ 
    dataSource: { 
     type: "odata", 
     transport: { 
      read: "http://demos.kendoui.com/service/Northwind.svc/Products" 
     }, 
     pageSize: 7, 

     aggregate: [{ 
      field: "ProductName", 
      aggregate: "count" 
     }, { 
      field: "UnitPrice", 
      aggregate: "sum" 
     }, { 
      field: "UnitsOnOrder", 
      aggregate: "sum" 
     }, { 
      field: "UnitsInStock", 
      aggregate: "min" 
     }, { 
      field: "UnitsInStock", 
      aggregate: "max" 
     }] 
    }, 
    sortable: true, 
    scrollable: false, 
    pageable: true, 
    columns: [{ 
     field: "ProductName", 
     title: "Product Name", 
     footerTemplate: "Total Count: #=count#", 
    }, { 
     field: "UnitPrice", 
     title: "Unit Price" 
    }, { 
     field: "UnitsOnOrder", 
     title: "Units On Order", 
     footerTemplate: "Sum: #=sum#", 
    }] 
}); 
}); 

Проблема заключается в том, что, как и в скрипке, сумма для всех строк на всех страницах. То, что я хочу, это сумма строк только на текущей странице.

Любые идеи, как изменить скрипку, чтобы сделать это?

Проект находится в углу, если это имеет значение.

Заранее спасибо.

+0

Вы нашли какое-либо решение ??? – Harsh

ответ

0

В конце концов, что я сделал, было вычислить текущую сумму страницы, как это:

$scope.getCurrentPageSums = function() { 
      var pageNumber = $scope.grid.dataSource.page(); 
      var pageSize = $scope.grid.dataSource.pageSize(); 
      var first = pageSize * (pageNumber - 1); 
      var last = first + pageSize - 1; 
      var resAmount = 0; 
      var resDistance = 0; 
      for (var i = first; i <= last; i++) { 
       if (allReports[i] != undefined) { 
        resAmount += allReports[i].AmountToReimburse; 
        resDistance += allReports[i].Distance; 
       } 

      } 
      $scope.currentPageAmountSum = resAmount; 
      $scope.currentPageDistanceSum = resDistance; 

} 

поручаю строки, возвращаемые с сервера allReports в схеме части источника данных

Schema { 
     Data: function(data){ 
      allReports = data; 
     } 
} 

Затем я вызываю getCurrentPageSums в части данных базы данных источника данных

dataBound: function() { 
      $scope.getCurrentPageSums(); 
} 

Fina LLY я связываю со значением currentPageSum в FooterTemplate соответствующего поля

field: "Distance", 
title: "Afstand", 
footerTemplate: "Side: {{currentPageDistanceSum}}, total: #= sum # " 
0

Набор serverPaging к истине.

pageSize: 7, 
serverPaging : true, 
aggregate: [{ 
       field: "ProductName", 
       aggregate: "count" 
      }, { 
       field: "UnitPrice", 
       aggregate: "sum" 
      }, { 
       field: "UnitsOnOrder", 
       aggregate: "sum" 
      }, { 
       field: "UnitsInStock", 
       aggregate: "min" 
      }, { 
       field: "UnitsInStock", 
       aggregate: "max" 
      }] 
0

Мое достижение для этой ситуации. I`ve письменное агрегат:

dataSource: { 
         data: dataOfTable, 
         aggregate: [ 
          {field: "field1", aggregate: "sum"}, 
          {field: "field2", aggregate: "sum"}, 
          {field: "field3", aggregate: "sum"} 
         ], 
         pageSize: 20 
        }, 

FooterTemplate для колонки:

{ 
field: "field1", 
title: 'Field1', 
footerTemplate: "#=getCurrentField1()#"  
} 

для field2, field3 и т.д .:

{ 
field: "field2", 
title: 'Field2', 
footerTemplate: "#=currentField2#"  
} 

И функция getCurrentField1:

// aggregates data on current page 
      var currentField1 = 0; 
      var currentField2 = 0; 
      var currentField3 = 0; 

      function getCurrentField1() { 

       var displayedData = $("#grid").data().kendoGrid.dataSource.view() 

       var resField1 = 0; 
       var resField2 = 0; 
       var resField3 = 0; 

       for (var i = 0; i <= displayedData.length; i++) { 
        if (displayedData[i] != undefined) { 
         resField1 += displayedData[i].field1; 
         resField2 += displayedData[i].field2; 
         resField3 += displayedData[i].field3; 
        } 
       } 

       currentField1 = resField1; 
       currentField2 = resField2; 
       currentField3 = resField3; 
       return currentPayAmount; 
      } 

С dataBound pagination работает ненадлежащим образом. Текущие данные в footerTemplates были неверными, поскольку привязка была сделана после установки значения footerTemplates`. Поэтому я добавляю функцию в первый столбец, который оценивает все текущие значения и правильно устанавливает их.

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