How to Get Filtered data from paged ui-grid

陌路散爱 提交于 2019-12-04 09:55:16

问题


I'd like to get filtered data from a ui-grid when the paging feature is enabled. In general case I used

 $scope.gridApi.core.on.filterChanged($scope, function () {

                if ($scope.gridApi.grid.columns[1].filter.term != "" && $scope.gridApi.grid.columns[1].filter.term != undefined) {
                    var dd =$scope.gridApi.core.getVisibleRows($scope.gridApi.grid);
                    console.log(dd);
            });

but the code doesn't work well when the paging is enabled, it return only rows of the first page. but I need all the filtered data.

the easiest solution is filter data source based on the filter term but it decreases the performance dramatically.

any advice?


回答1:


Note: I didn't try it with pagination, just grouping, but hope it gives you a hint.


Try using the rowsVisibleChanged event together with the filterChanged event. You have to use both because if you use the filterChanged event alone it won't work since it's launched before the rows are actually filtered. I use a flag variable (filterChanged) to know if a filter was modified.

Then, use something like lodash to filter the $scope.gridApi.grid.rows that have the visible property set to true:

// UI-Grid v.3.0.7
var filterChanged = false;

$scope.gridApi.core.on.filterChanged($scope, function() {
    filterChanged = true;
});

$scope.gridApi.core.on.rowsVisibleChanged($scope, function() {
    if(!filterChanged){
        return;
    }
    filterChanged = false;
    // The following line extracts the filtered rows
    var filtered = _.filter($scope.gridApi.grid.rows, function(o) { return o.visible; });
    var entities = _.map(filtered, 'entity'); // Entities extracted from the GridRow array
});



回答2:


I was able to export filtered data across all pagination via uiGridExporterService service. Thanks to @Patricio's above answer for the hint.

//you can set it to ALL or VISIBLE or SELECTED
var columnsDownloadType = uiGridExporterConstants.ALL;

//get all the visible rows across all paginations
var filtered = _.filter(grid.api.grid.rows, function (o) {
    return o.visible;
});

//get the entities of each of the filtered rows
var entities = _.map(filtered, 'entity');

//get all or visible column headers of this grid depending on the columnsDownloadType
var exportColumnHeaders = grid.options.showHeader ? uiGridExporterService.getColumnHeaders(grid, columnsDownloadType) : [];

var exportData = [];
/**this lodash for-each loop will covert the grid data into below array of array format 
* [[{value:'row1col1value'},{value:'row1col2value'}],[{value:'row2col1value'},{value:'row2col2value'}].....]
* uiGridExporterService.formatAsCsv expects it in this format
**/
_.each(entities, function (row) {
    var values = [];
    _.each(exportColumnHeaders, function (column) {
        var value = row[column.name];
        values.push({value: value});
    });
    exportData.push(values);
});

//format the header,content in csv format
var csvContent = uiGridExporterService.formatAsCsv(exportColumnHeaders, exportData, ',');

//export as csv file
uiGridExporterService.downloadFile(grid.options.exporterCsvFilename, csvContent, grid.options.exporterOlderExcelCompatibility);



回答3:


I tried the custom exporter and it worked!

  • Prerequisites :

    enableSelectAll:true,
    multiSelect:true,
    
  • your controller needs :

    uiGridExporterService,uiGridExporterConstants
    
  • app module needs :

    "ui.grid.selection"   ,"ui.grid.exporter"
    
    $scope.exportCSV = function(){
                         var exportService=uiGridExporterService;
                         var grid=$scope.gridApi.grid;
                         var fileName="myfile.csv";
    
                         exportService.loadAllDataIfNeeded(grid, uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE).then(function() {
                           var exportColumnHeaders = exportService.getColumnHeaders(grid, uiGridExporterConstants.VISIBLE);
    
                           $scope.gridApi.selection.selectAllVisibleRows();
    
                           var exportData = exportService.getData(grid, uiGridExporterConstants.SELECTED,uiGridExporterConstants.VISIBLE);
                           var csvContent = exportService.formatAsCsv(exportColumnHeaders, exportData, grid.options.exporterCsvColumnSeparator);
                           exportService.downloadFile(fileName, csvContent, grid.options.exporterOlderExcelCompatibility);
                           $scope.gridApi.selection.clearSelectedRows();
                         });
                       }
    


来源:https://stackoverflow.com/questions/33764946/how-to-get-filtered-data-from-paged-ui-grid

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!