这个教程将介绍在AngularJS应用中的服务端分页处理。在任何涉及到列表或表格数据的应用中都可能会用到分页。

概念

当我们处理异步分页时,每次只从服务器上获取一页数据。也就是说当用户点击第二页,就只读取第二页的数据。

下载地址:

https://github.com/rahil471/Server-Side-Pagination-In-AngularJS

概述

 在客户端我们将使用到 dir-paginate 组件。调用后台API需要传递两个参数 page number 和  items per page。举个例子,每页显示10条记录,在你查看第二页时,那么API需要返回的记录是从第11条记录开始的。除了返回数据项,API还需要返回总记录数。总记录数对于分页至关重要。

 

分页API解释

返回分页数据的API需要两个参数

http://yourdomain/apiname/{itemsPerPage}/{pagenumber}

有这两个参数 itemsPerPage 和 pagenumber 你就可以对向数据库发出恰当的请求了。例如,如果{itemsPerPage} 是 10 and {pagenumber} 是 3,API就会是下面的样子。

http://yourdomain/apiname/10/3

相应的MySQL查询语句就是这样的

SELECT * FROM 'table_name' LIMIT ({pagenumber}-1)*{itemsPerPage},{itemsPerPage}

 实际上如下:

SELECT * FROM 'table_name' LIMIT 20,10

上面的语句会返回 第21条到第30条的记录(MySql的索引号是从0开始的)。

实现

首先我们需要先获得创建HTML文件需要的组件,要实现分页需要先下载 dirPagination.js 或是这个 dirPagination.js

INDEX.HTML

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Server Pagination in Angular js</title>
    <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="css/bootstrap-theme.min.css">
    <link rel="stylesheet" type="text/css" href="css/styles.css">
  </head>
  <body>
        <script src="lib/angular/angular.js"></script>
        <script src="lib/dirPagination.js"></script>
        <script src="app/app.js"></script>
  </body>
</html>

我们需要引用到  angular.js  和 dirPagination.js,app.js是我们用来编写JS代码的文件。还需要引用一些CSS来实现扁平化UI。

现在让我们创建下Angular app

APP/APP.JS

var app = angular.module('angularTable', ['angularUtils.directives.dirPagination']);
app.controller('listdata',function($http){
    var vm = this;
    vm.users = []; //declare an empty array
    vm.pageno = 1; // initialize page no to 1
    vm.total_count = 0;
    vm.itemsPerPage = 10; //this could be a dynamic value from a drop down
    vm.getData = function(pageno){ // This would fetch the data on page change.
        //In practice this should be in a factory.
        vm.users = [];  
$http.get("http://yourdomain/apiname/{itemsPerPage}/{pagenumber}").success(function(response){ //ajax request to fetch data into vm.data vm.users = response.data; // data to be displayed on current page. vm.total_count = response.total_count; // total data count. }); }; vm.getData(vm.pageno); // Call the function to fetch initial data on page load. });

 上面的示例我们声明了angularJS的应用(app)和控制器(controller),并且添加了angularUtils.directives.dirPagination作为我们应用的依赖项。控制器中采用.vm代表 view-model 作为 this 的引用。首先我们对一些重要的参数进行了初始化。

   1、vm.users – 用来存储页面上数据的集合。
   2、vm.pageno – 加载时设置当前页为1。
   3、vm.total_count – 存储总记录数。 结果又由API返回
   4、vm.itemsPerPage – 每页显示记录数 (可动态设置)
   5、vm.getData() – 每次用户点击新页时调用的方法. 初始加载第一页。

现在我们的控制器已经准备好了。下面我使用 dir-paginate 指令重复显示数据(替代了angularjs的ng-repeat指令),将total_count赋给total-items指令

dir-paginate将使用这个数值来生成分页链接。

<tr dir-paginate=”user in data.users|itemsPerPage:data.itemsPerPage” total-items=”data.total_count”>

下一步我们将使用dir-pagination-controls指令添加分页链接。

PAGINATION CONTROLS

   <dir-pagination-controls
        max-size="8"
        direction-links="true"
        boundary-links="true" 
        on-page-change="data.getData(newPageNumber)">
    </dir-pagination-controls>

on-page-change 指令这里是关键,在每次页改变的时候都会调用一个函数,用这个指令来调用vm.getdata(pageno)方法。这个方法会使用新的页码向服务器请求下一页的数据。

不要忘记声明你自己的 ng-app 和 ng-controller。看下完成标记。

INDEX.HTML

<!doctype html>
<html lang="en" ng-app="angularTable">
  <head>
    <meta charset="utf-8">
    <title>Server Side Pagination in Angular js</title>
    <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="css/bootstrap-theme.min.css">
    <link rel="stylesheet" type="text/css" href="css/styles.css">
  </head>
  <body>
    <div role="main" class="container theme-showcase">
      <div class="" style="margin-top:90px;">
        <div class="col-lg-8">
            <div class="page-header">
                <h2 id="tables">Server Side pagination in Angular js</h2>
            </div>
            <div class="bs-component" ng-controller="listdata as data">
                <table class="table table-striped table-hover">
                    <thead>
                        <tr>
                            <th>Id</th>
                            <th>First Name</th>
                            <th>Last Name</th>
                            <th>Full Name</th>
                            <th>Email</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr ng-show="data.users.length <= 0"><td colspan="5" style="text-align:center;">Loading new data!!</td></tr>
                        <tr dir-paginate="user in data.users|itemsPerPage:data.itemsPerPage" total-items="data.total_count">
                            <td>{{user.index}}</td>
                            <td>{{user.name}}</td>
                            <td>{{user.surname}}</td>
                            <td>{{user.fullname}}</td>
                            <td>{{user.email}}</td>
                        </tr>
                    </tbody>
                </table> 
                <dir-pagination-controls
                   max-size="8"
                   direction-links="true"
                   boundary-links="true" 
                   on-page-change="data.getData(newPageNumber)" >
                </dir-pagination-controls>
            </div>
        </div>
      </div>
    </div>
        <script src="lib/angular/angular.js"></script>
        <script src="lib/dirPagination.js"></script>
        <script src="app/app.js"></script>
  </body>
</html>

ng-controller="listdata as data" 采用了ControllerAs语法。

如果想了解更多的dirPaginate ,你可以点击这里

结论

文章中我们已经看到如何在angularjs项目中简单地实现分页。分页通常用于大数据集。减少了加载时间,也使DOM轻便多了。

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐