简体   繁体   English

Angular UI-Grid无限滚动/分页不保留先前的数据

[英]Angular UI-Grid infinite scroll/pagination not keeping previous data

The issue I'm running into is that when my scroll bar reaches near the bottom, it makes the call for the next 100 records in the result set, however, it replaces the previous 100 records with the new 100. Am I missing something with infinite scroll. 我遇到的问题是,当滚动条到达底部附近时,它将调用结果集中的下100条记录,但是,它将新的100条记录替换为前100条记录。无限滚动。 Here is my controller logic 这是我的控制器逻辑

'use strict';

var first = angular.module('TqimApp');
first.controller('NewGridCtrl',  ['$scope', '$http', 'NewGridService', '$timeout', '$modal', '$interval', '$location', 'uiGridConstants', '$filter', '$rootScope',
function($scope, $http, NewGridService, $timeout, $modal, $interval, $location, uiGridConstants, $filter, $rootScope) {
$( "div[id^='nvtooltip']" ).css( "display" , "none");

var id, af;
$scope.headers = [];
$scope.reportQuery = {};
$scope.gridOptions = {};
$scope.pageNumber=0;
$scope.recordNumber=0;
$scope.totalItemsSize=0;
$scope.modeValue = true;
$scope.orderByColumn=null;
$scope.defaultOrderByColumn=null;
var paginationOptions = { pageNumber: 0, pageSize: 25, sort: null };
var params = [];
var whereColumn=[];
$scope.columnName=null;
$scope.columnValue=null;
$scope.gridApi=null;

var words = tokenize( location.href,  '?'); //20160221 moved, changed path to location.href
var words = splitTheSecond( words,  '&'); //20160221 moved

angular.forEach(words, function(word, idx) { //20160221 moved
    var subw = tokenize( word,  '=');
    params[subw[0]]=subw[1];
});

function tokenize( str, token ){
    if( str == null ) return null;
    var words = str.split( token );
    if( words==null || words.length<2 ) {
          console.log( "tokenize error on parsing path " + str );
          return null;
    }
    return words;
};

function splitTheSecond( arrStr, token){
    if( !$.isArray(arrStr) ) return null;
    return tokenize(arrStr[1], token);
};

$scope.grid = {
    'cd': params['cd'],
    'catCd': params['catCd'],
    'id': params['id'],
    'af': params['af'],
    'isPaged': true,
    'recordNumber': 0,
    'pageSize': 100, //20160221 added
    'pd': params['pd'],                              /* production date*/
    'pg': $scope.pageNumber,                         /* page number */
    'ps': paginationOptions.pageSize,                /* page size */
    'oc': $scope.columnName,                         /* order column name */
    'ov': $scope.columnValue,                        /* order column value */
    'order': paginationOptions.sort,                 /* ASCending or DEScending */
    'rv': params['rv'],                               /* result value*/
    's1': params['s1'],                               /* string1*/
    's2': params['s2'],                               /* string2*/
    's3': params['s3'],                               /* string3*/
    's4': params['s4'],                               /* string4*/
    's5': params['s5'],                               /* string5*/
    'month' : params['month']                         /*month*/
};

if( params.filterIds != undefined ) {
    $scope.grid.filterIds = decodeURIComponent( params.filterIds );
}
if( params.qp != undefined ) {
    var qp = decodeURIComponent( params.qp );
    $scope.grid.qp = JSON.parse(qp);
}

$scope.highlightFilteredHeader = function( row, rowRenderIndex, col, colRenderIndex ) {
    if( col.filters[0].term ){
        return 'header-filtered';
    } else {
        return '';
    }
};

$scope.gridOptions = {
     //columnDefs: $scope.headers,
     enablePaginationControls: true,
     enableFiltering: true,
     enableSorting: true,
     useExternalSorting: true,
     visible: true,
     infiniteScrollDown: true,
     infiniteScrollUp: true,
     exporterMenuCsv: true,
     exporterMenuPdf: false,
     enableGridMenu: true,
};

NewGridService.getHeaders($scope.grid.catCd).then(
          function(result)  {
                var returnArray = [];                   
                for( var i = 0; i < result.length; i++ ){
                      returnArray.push({field: result[i].key, displayName: result[i].name, 
                      enableFiltering: true,  headerCellClass: $scope.highlightFilteredHeader, 
                      filter: { term: "", }});
                }                                         
                $scope.defaultOrderByColumn = $scope.grid.catCd == 'CMP_GRD'? 'complaint_result_id' : 'test_result_id';
                $scope.headers = returnArray;
                $scope.gridOptions.columnDefs = $scope.headers;
         },
         function(error){
             console.error(error);
});

var getPage = function(whereColumn) {
    console.log('getPage');

    $scope.reportQuery.whereColumn = whereColumn;
    $scope.reportQuery.fromIndex = $scope.pageNumber;
    $scope.reportQuery.toIndex = paginationOptions.pageSize;
    $scope.reportQuery.orderByColumn = $scope.sortColumnName;
    $scope.grid.recordNumber = $scope.grid.recordNumber + $scope.grid.pageSize;

    getGridData();
    console.log('Grid Size: '+$scope.grid.recordNumber);
};

$scope.getDataDown = function() {
    if($scope.modeValue) {
        $scope.gridApi.infiniteScroll.dataLoaded().then(function() {
            getPage(whereColumn);
        }).then(function() {
            }
        );
    }
};

$scope.gridOptions.onRegisterApi = function(gridApi) {
           console.log('onRegisterApi');
           $scope.gridApi = gridApi;

           $scope.gridApi.core.on.sortChanged($scope, function(grid,  sortColumns) {
                    console.log('sort changed!');
                    console.log(sortColumns);

                    //20160221 added variable resets
                    $scope.grid.totalRecordCount = 0;
                    $scope.grid.recordNumber = 0;

                    //20160221 added block of code to refresh grid after sort
                    var sortClmnList = [];
                    if(sortColumns.length == 0) {
                        sortClmnList.push($scope.defaultOrderByColumn+" ASC");
                    } else {
                        angular.forEach(sortColumns,  function(sCriteria) {
                            sortClmnList.push(sCriteria.name+" "+sCriteria.sort.direction);
                        });
                    }
                    $scope.grid.sortCriteria = sortClmnList;

                    getGridData();
          });

          $scope.gridApi.core.on.filterChanged( $scope,  function() { //20160221 added
                console.log('filter changed!');

                //20160221 added block of code to refresh grid after filter
                var whereColumn = [];
                angular.forEach($scope.gridOptions.columnDefs,  function(obj) {
                    if(obj.visible) {
                        $scope.column.push(obj.name);
                    }
                    if(obj.filter.term!="" && obj.filter.term!=null) {
                        whereColumn.push(obj.name+","+obj.filter.term);
                    }
                });

                $scope.grid.whereColumn = whereColumn;
                $scope.totalItemsSize = $scope.gridOptions.data.length;
                console.log('$scope.grid.whereColumn='+whereColumn);
                getGridData();

        });
        gridApi.infiniteScroll.on.needLoadMoreData($scope, $scope.getDataDown);
};

function formatDates(data) {
    for (var i = 0; i < data.length; i++) {

        if(data[i].production_Date != null) {
            var currentValue = data[i].production_Date;
            var currentDate = new Date(parseInt(currentValue));
            var month = currentDate.getMonth() + 1;
            var day = currentDate.getDate();
            if( day < 10 ) {
                day = '0'+ day;
            }
            var year = currentDate.getFullYear();
            var date = month + "/" + day + "/" + year;
            data[i].production_date = date;
         }
    }        
};

function getGridData() { 
    NewGridService.getGridData($scope.grid).then(
    function(data){console.log(data);
        formatDates(data);
        $scope.gridOptions.data = data;
        $scope.totalItemsSize = $scope.totalItemsSize + $scope.gridOptions.data.length;
        $scope.gridOptions.data = $scope.gridOptions.data.concat($scope.gridOptions.data);
    },
    function(error){
        console.error(error);
    });
 }
 getGridData();

}]);

Maybe this is your issue. 也许这是你的问题。

function getGridData() { ... $scope.gridOptions.data = data; 函数getGridData(){... $ scope.gridOptions.data = data; // replacing data ... $scope.gridOptions.data = $scope.gridOptions.data.concat($scope.gridOptions.data); //替换数据... $ scope.gridOptions.data = $ scope.gridOptions.data.concat($ scope.gridOptions.data); ... } ...}

see line with comment: so your previous data will be overwritten before you concat the old with new data. 请参阅带有注释的行:因此,在将旧数据与新数据合并之前,您的先前数据将被覆盖。

greets Christian 问候克里斯蒂安

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM