Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 58376|回复: 0

Angularjs的真分页,服务端分页,后台分页的解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-6 22:19:43 | 显示全部楼层 |阅读模式

    背景:项目的框架使用的是Angularjs,在做数据展示的时候,使用的是ng-table。用过ng-table的人都知道,他是自带分页的,默认分页方式是假分页。也就是一口气把所有的数据从数据库里取出来,然后再进行分页。这样做的好处是,在分页时候,不需要频繁访问数据库,减少数据库压力。同时,也能够提高翻页速度,提升用户体验。这些功能都是自带的,对于开发人员只要做一些简单的配置就好了。节约不少开发时间。这种方式在数据不多,查询不慢的情况下,效果很好,但是一旦数据多,查询慢了,体验会很差。就好比我这次,本身查询就会有些慢,再加上数据有几万条。所以ng-table每一次加载需要1分钟的时间。用户体验很差。所以,让我考虑使用服务端分页。

    遇到的问题:网上查了很多资料,自己也试了很多。有件事情想要说下。经过我个人测试,发现ng-table是无法做到服务端分页的。之前还天真的以为,通过ng-table的一些配置,加上Angularjs的watch方法,对页码进行监听。就可以进行分页。后来发现这样的想法有一个无法跨过的坎。那就是,ng-table的数据和它自带的分页控件是强关联的。什么意思?

    打个比方,如果我一页10行,当我翻到第二页的时候,显示的是第11-第20条数据。如果是服务端的分页方式,我就需要把页码设置在第二页,数据则是从服务端取出第11-第20条。其实,我提供给ng-table的数据源里面只有10条数据。所在设置的时候,虽然我可以将页码设置成第二页。但是,ng-table在取数据的时候,会取他数据集里面的第11-第20条,可因为,我是服务端的分页方式,其实数据集中只有10条数据。它是根本无法取到数据集中第11-第20条数据的。所以,ng-table的页码和数据集是紧密关联。无法分开单独设置。这也就是为什么,他不能做服务端分页的原因。

    --以上是我自己总结的结果,如果大家测试下来和我有不一样的结果,请大家指正----------------------------------------------------

    解救方案:搜索了半天,有一个帖子给了我一点方向。http://www.cnblogs.com/sword-successful/archive/2015/06/28/4605222.html,网上有很多都是引用的这个方式,但是按照他上面说的方法,我是没有成功过。而且,下面的百度云盘也是无法使用的。不过,给我指明一个方向,就是使用tm.pagination.js插件。接下来说方法。

    1. 下载tm.pagination.js,

    2.在需要分页的html页面中,引用<script src="~/js/tm-pagination/tm.pagination.js"></script>,这里注意引用的先后顺序,是先引用angular.min.js,再引用tm.pagination.js,最后引用controller的js

    3.在你html页面中,需要分页的table下面添加<tm-pagination conf="paginationConf"></tm-pagination>

     

    4.注入tm.pagination.js,var app = angular.module('App', ['tm.pagination']); // 创建应用域,并且注入tm.pagination

    5.编写访问数据的两个服务。一个是获取总页数,一个是条件,页码,每页的显示条数,获取数据的

    app.factory('ListFactory', function ($http, $rootScope) {
        return {
            getList: function (condition) {
                return $http.get(baseAddress + "trust/GetResult?" + condition);
            },
            getListCount: function (condition) {
                return $http.get(baseAddress + "trust/GetResultCount?" + condition);
            }
        };

    6.在Angularjs的controller中初始化,分页控件,并且编写分页方法。

    // 在controller初始化的时候,注册ListFactory服务
    app.controller('ListController', function ($window, $scope, $http, $location, $timeout, ListFactory) {
    // 条件url
        $scope.urlCondition = "";
    
        // 查询数据结果集的总数量
        $scope.ListCount = 0;
    
        // json数据
        $scope.List = "";
    
        // 配置分页的基本参数,分页控件的初始化
        $scope.paginationConf = {
            currentPage: 1, // 当前页数
            totalItems: 0, // 一共多少条数据,和itemsPerPage决定一共会有几页
            itemsPerPage: 10, // 每页几条数据,和totalItems决定一共会有几页
            pagesLength: 15 
        };
    
    
        $scope.search = function () {
    
            // 条件url
            $scope.urlCondition = "";
    
    
            // 获取每个输入框的值var Name = $("#Name").val();
    if (Name != '' && Name != null) {
                $scope.urlCondition += "EngName=" + Name + "&";
            }// 初始化json数据,每次点击查询按钮的时候,要清空一次数据集,否则页面会一直保留之前的一次查询数据
            $scope.List = "";
            $scope.paginationConf.totalItems = 0;
            $scope.paginationConf.onChange = function () {
                console.log($scope.paginationConf.currentPage);
            }
    
            // 获取总条数
            ListFactory.getListCount($scope.urlCondition).then(function successCallback(response) {
                // 当获取总页数成功时候,进行操作
    
                // 获取总页数
                $scope.ListCount = response.data;
                // 设置分页属性
                $scope.paginationConf.currentPage = 1;
                // $scope.paginationConf.totalItems = $scope.ListCount; // 这里注释掉设置totalItems的属性,放在第一次查询时候,再设置,原因是当设置了totalItems,分页控件就会出现,而这个时候,数据还没有出现,为了保持数据和分页控件一起出现,需要在后面进行设置
                $scope.paginationConf.itemsPerPage = 10;
                $scope.paginationConf.pagesLength = 15;
                // 设置每一次分页时候的查询动作
                $scope.paginationConf.onChange = function () {
                    // 初始化json数据
                    $scope.List = "";
                    // 每一次分页获取数据
                    ListFactory.getList(
                        $scope.urlCondition
                        + "CurrentPage=" + $scope.paginationConf.currentPage + "&"
                        + "PageSize=" + $scope.paginationConf.itemsPerPage + "&").then(function successCallback(response) {
                            $scope.List = response.data;
                        }).catch(function (response) {
                            $scope.error = "An Error has occured while Loading ! " + response.ExceptionMessage;
                        });
                }
    
                // 由于插件有一个bug,就是在绑定onChange方法时候,无法执行第一次查询,所以,这里需要手动进行,第一次初始化数据
                ListFactory.getList($scope.urlCondition
                        + "CurrentPage=" + $scope.paginationConf.currentPage + "&"
                        + "PageSize=" + $scope.paginationConf.itemsPerPage + "&").then(function successCallback(response) {
                            $scope.List = response.data;
                            // 当设置总行数的时候,分页栏就会出现,为了让分页栏和数据一起出现,所以放在这里设置
                            $scope.paginationConf.totalItems = $scope.ListCount;
                        }).catch(function (response) {
                            $scope.error = "An Error has occured while Loading ! " + response.ExceptionMessage;
                        });
    
            }).catch(function (response) {
                $scope.error = "An Error has occured while Loading ! " + response.ExceptionMessage;
            });
        };
    });

     

     

     

     

     

     

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-19 19:04 , Processed in 0.069116 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表