Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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 AngularJS中服务器端和客户端分页的组合_Javascript_Angularjs_Spring Mvc_Pagination - Fatal编程技术网

Javascript AngularJS中服务器端和客户端分页的组合

Javascript AngularJS中服务器端和客户端分页的组合,javascript,angularjs,spring-mvc,pagination,Javascript,Angularjs,Spring Mvc,Pagination,我将spring框架用于后端和AngularJS。我需要对一个表使用服务器端和客户端分页,所以我将把页码和页面大小传递给rest服务。现在,我需要执行以下场景: 如果数据库中有20000条记录: 从数据库中获取前2500条记录,然后对它们进行分页 在对前2500条记录进行分页后,获取下一个2500条记录(从2501到5000),依此类推,直到完成数据库中的所有记录 我可以用角度数据表或任何角度表来实现这一点吗?我们的要求与您描述的完全相同。我们在网上搜索,没有找到答案。最后我们研究并提出了一个解

我将spring框架用于后端和AngularJS。我需要对一个表使用服务器端和客户端分页,所以我将把页码和页面大小传递给rest服务。现在,我需要执行以下场景:

如果数据库中有20000条记录:

  • 从数据库中获取前2500条记录,然后对它们进行分页

  • 在对前2500条记录进行分页后,获取下一个2500条记录(从2501到5000),依此类推,直到完成数据库中的所有记录


  • 我可以用角度数据表或任何角度表来实现这一点吗?

    我们的要求与您描述的完全相同。我们在网上搜索,没有找到答案。最后我们研究并提出了一个解决方案。希望它能帮助其他正在寻找解决方案的人

    我们正在使用。在angular ui.grid中,您可以使用默认的客户端分页,也可以实现外部(或服务器端)分页

    但是,在您的需求中,您需要结合客户端和服务器端分页,这是灵活的,并且在您有大量数据(缺少的记录数)时非常需要

    若你们不知道如何使用服务器端分页,那个么看看这个问题。您可以查看工作服务器端分页实现

    我修改这个实现是为了实现客户端和服务器端分页的组合

    var useHybridPagination = true;
    var paginationPageSize = 25;
    var serverPaginationPageSize = 2500;    
    var serverPaginationOffset = 0;
    var serverPaginationGridData = {};
    
    var clientPaginationOptions  = {
            pageNumber: 1,
            pageSize: paginationPageSize,           
          };
    
    var serverPaginationOptions = {
            pageNumber: 1,
            pageSize: serverPaginationPageSize,         
          };    
    
    var paginationRowRange = {}
    paginationRowRange.startRowIndex = 1;
    paginationRowRange.endRowIndex = paginationPageSize;
    
    var serverPaginationRowRange = {}
    serverPaginationRowRange.startRowIndex = 1;
    serverPaginationRowRange.endRowIndex = serverPaginationPageSize;   
    
    我将使用服务器端分页逻辑来提取每2500条记录。而且,要在客户端(2500条记录)的页面间导航,只需进行很少的修改。如果用户在客户端的2500条记录中存在新的页面,则按照服务器PaginationOptions.pageSize所示对记录数进行切片,并加载网格。或者获取接下来的2500条记录并重新评估行索引

    $scope.clientPaginationOptions  = clientPaginationOptions ;
    $scope.serverPaginationOptions = serverPaginationOptions;
    $scope.paginationRowRange = paginationRowRange;
    $scope.serverPaginationRowRange = serverPaginationRowRange;
    $scope.serverPaginationOffset = serverPaginationOffset;
    $scope.serverPaginationGridData = serverPaginationGridData;
    
    $scope.gridOptions = {
        paginationPageSizes: [25, 50, 75],
        paginationPageSize: $scope.clientPaginationOptions .pageSize,
        useExternalPagination: true,        
        columnDefs: [
          { name: 'name' },
          { name: 'gender', enableSorting: false },
          { name: 'company', enableSorting: false }
        ],
        onRegisterApi: function(gridApi) {
          $scope.gridApi = gridApi;
    
          gridApi.pagination.on.paginationChanged($scope, function (newPage, pageSize) {
            $scope.clientPaginationOptions .pageNumber = newPage;
            $scope.clientPaginationOptions .pageSize = pageSize;
    
            let startRowIndex = (($scope.clientPaginationOptions .pageNumber - 1) * $scope.clientPaginationOptions .pageSize) + 1;
            let endRowIndex =  (startRowIndex - 1 ) + clientPaginationOptions .pageSize;            
    
            if(endRowIndex > $scope.serverPaginationRowRange.endRowIndex || startRowIndex < $scope.serverPaginationRowRange.startRowIndex){             
    
                $scope.serverPaginationOptions.pageNumber = parseInt(($scope.clientPaginationOptions .pageNumber * pageSize)/$scope.serverPaginationOptions.pageSize) + 1;
    
                let serverStartRowIndex = (($scope.serverPaginationOptions.pageNumber - 1) * $scope.serverPaginationOptions.pageSize) + 1;
                let serverEndRowIndex =  (serverStartRowIndex - 1 ) + $scope.serverPaginationOptions.pageSize;                  
    
                let paginationRowRangeTmp = {}
                paginationRowRangeTmp.startRowIndex = serverStartRowIndex;
                paginationRowRangeTmp.endRowIndex = serverEndRowIndex;    
                $scope.serverPaginationRowRange = paginationRowRangeTmp;                
    
                $scope.serverPaginationOffset = serverStartRowIndex - 1;
            }
    
            startRowIndex = startRowIndex - $scope.serverPaginationOffset;
            endRowIndex = endRowIndex - $scope.serverPaginationOffset;          
    
            let paginationRowRangeTmp = {}
            paginationRowRangeTmp.startRowIndex = startRowIndex;
            paginationRowRangeTmp.endRowIndex = endRowIndex;    
            $scope.paginationRowRange = paginationRowRangeTmp; 
    
            getPage();
          });
        }
    };
    getPage();
    
    var getPage = function() {
    
        if(useHybridPagination && !_.isEmpty($scope.serverPaginationGridData)){
            var currentPageData = getcurrentPageData();
            $timeout(function() {
                $scope.gridOptions.data = datatoLoadGrid;
               }, 1);
        }
        else{
            var url = 'https://cdn.rawgit.com/angular-ui/ui-grid.info/gh-pages/data/100.json';
            $http.get(url,$scope.serverPaginationRowRange)
                .then(function (returnData) {
                    $scope.gridOptions.totalItems = returnData.data.totalPaginationRecords;
                    let datatoLoadGrid = returnData.data.gridData;
    
                    if(useHybridPagination){
                        $scope.serverPaginationGridData = datatoLoadGrid;
                        datatoLoadGrid = getcurrentPageData();
                    }
                    $scope.gridOptions.data = datatoLoadGrid;
                });
        }
    };  
    
    var getcurrentPageData = function(){
        var gridData = [];
    
        var tmpGridrecords = $scope.serverPaginationGridData;
        if(!_.isEmpty(tmpGridrecords) && tmpGridrecords.length > 0)
            gridData = tmpGridrecords.slice($scope.paginationRowRange.startRowIndex-1, $scope.gridOptions.endRowIndex);
    
        return gridData;
    };  
    
    $scope.clientPaginationOptions=clientPaginationOptions;
    $scope.serverPaginationOptions=serverPaginationOptions;
    $scope.paginationRowRange=paginationRowRange;
    $scope.serverPaginationRowRange=serverPaginationRowRange;
    $scope.serverPaginationOffset=serverPaginationOffset;
    $scope.serverpaginationridata=serverpaginationridata;
    $scope.gridOptions={
    分页页面大小:[25,50,75],
    paginationPageSize:$scope.clientPaginationOptions.pageSize,
    useExternalPagination:true,
    columnDefs:[
    {name:'name'},
    {name:'gender',enableSorting:false},
    {name:'company',enableSorting:false}
    ],
    onRegisterApi:函数(gridApi){
    $scope.gridApi=gridApi;
    paginationChanged($scope,function(newPage,pageSize){
    $scope.clientPaginationOptions.pageNumber=newPage;
    $scope.clientPaginationOptions.pageSize=pageSize;
    让startRowIndex=($scope.clientPaginationOptions.pageNumber-1)*$scope.clientPaginationOptions.pageSize)+1;
    让endRowIndex=(startRowIndex-1)+clientPaginationOptions.pageSize;
    如果(endRowIndex>scope.serverPaginationRowRange.endRowIndex | | StartRowWindex0)
    gridData=tmpGridrecords.slice($scope.paginationRowRange.startRowIndex-1,$scope.gridOptions.endRowIndex);
    返回网格数据;
    };  
    
    如您所见,web服务(或API)返回具有两个属性的数据对象—totalPaginationRecords和gridDatatotalPaginationRecords是可能的记录总数,即在本例中为20000gridData是要加载的网格数据(页面大小为2500)

    所有转角条件均已处理。希望我